列表迭代算法

时间:2019-05-03 15:41:26

标签: python python-3.x

我最近开始进行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...

但是,它不起作用。而且,我怀疑编码不好。使用这两个列表获得正确答案的合理选择是什么?感谢您的帮助!

4 个答案:

答案 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]