我最近开始进行Python编码,并决定制作一个简短的程序。一年前,我参加了一次历史考试,其中的首要任务是按时间顺序排列三个事件。我想使用随机化这些事件的程序来重新创建此任务,以使其有可能生成成千上万个这样的独特任务(在实际程序中不应显示年份):
1。铜暴动(1662)
2。库利科沃战役(1380)
3。第一次十字军东征(1096)
我设法做到了。但是每个任务都有答案。它存储在名为 years 的列表中。还有一个名为 syears 的列表,按时间顺序对其进行了排序。
years = [1662, 1497, 1096]
syears = [1096, 1497, 1662]
有一个名为 answer 的变量,应存储正确的答案。 正确的答案是: 321
但是我有一个程序无法获得正确答案,我决定蛮力地解决它:
answer = 0
if years[0] == syears[0]:
# answer = '1'
if years[1] == syears[1]:
# answer = '12'
if years[2] == syears[2]:
answer = '123'
else:
answer = '132'
elif years[1] == syears[1]:
# answer = '2'
if years[0] == syears[0]:
# answer = '21'
if years[2] == syears[2]:
answer = '213'
else:
answer = '231'
And so on...
但是,它不起作用。而且,我怀疑编码不好。使用这两个列表获得正确答案的合理选择是什么?感谢您的帮助!
答案 0 :(得分:1)
使用列表的index
方法
[years.index(value) + 1 for value in syears]
答案 1 :(得分:0)
查找每个元素的索引最好在循环中完成,就像这样:
answer = []
for syear in syears:
idx = years.index(syear)
answer.append(idx)
(这里的索引从零开始。如果希望它们从一开始,则将它们加1。)
当然,还有许多其他方法可以在这里完成您要执行的操作。包括这样的单行列表理解,可以完全避免使用syears
:
answer = [idx for idx, elem in sorted(enumerate(years), key=lambda x: x[1])]
答案 2 :(得分:0)
这是不使用年份的另一种方式。
p = sorted(range(1,len(years)+1), key=lambda k: years[k-1])
print("".join([str(i) for i in p]))
#### Output ####
321
答案 3 :(得分:0)
这样,您将始终拥有不同的顺序:
from random import shuffle
def gimmeThreeEvents():
events = [
["Copper Riot", 1662],
["The Battle of Kulikovo",1380],
["The First Crusade",1096]
]
shuffle(events)
order = [x[1] for x in events]
sort = sorted(order)
print(order)
print(sort)
print("Order this events:")
for e in events:
print("- " + str(e[0]))
print("Solutions:")
sol = []
for dates in order:
sol.append(sort.index(dates) + 1)
print(sol)
return events
gimmeThreeEvents()
输出:
Order this events:
- The Battle of Kulikovo
- Copper Riot
- The First Crusade
Solutions:
[2, 3, 1]
[Finished in 0.1s]