Python 列表迭代算法

Python 列表迭代算法,python,python-3.x,Python,Python 3.x,我最近开始编写Python代码,并决定编写一个简短的程序。一年前我参加了一次历史考试,考试的第一项任务是按时间顺序排列三件事。我想用一个程序重新创建这个任务,该程序将这些事件随机化,这样它就有可能生成数千个这样的独特任务(在实际的程序中不应该看到年份): 1.铜暴动(1662年) 2.库利科沃战役(1380年) 3.第一次十字军东征(1096年) 我设法做到了。但每项任务都有答案。它存储在一个名为“年份”的列表中。还有另一个列表,叫做syears,它按时间顺序排序 years = [1662,

我最近开始编写Python代码,并决定编写一个简短的程序。一年前我参加了一次历史考试,考试的第一项任务是按时间顺序排列三件事。我想用一个程序重新创建这个任务,该程序将这些事件随机化,这样它就有可能生成数千个这样的独特任务(在实际的程序中不应该看到年份):

1.铜暴动(1662年)

2.库利科沃战役(1380年)

3.第一次十字军东征(1096年)

我设法做到了。但每项任务都有答案。它存储在一个名为“年份”的列表中。还有另一个列表,叫做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...

但是,它不起作用。此外,我怀疑这是一个糟糕的编码。使用这两个列表获得正确答案的合理选择是什么?谢谢你的帮助

使用列表的
索引
方法

[years.index(value) + 1 for value in syears]

查找每个元素的索引最好在循环中完成,如下所示:

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])]

这只是不用syears的另一种方式

p = sorted(range(1,len(years)+1), key=lambda k: years[k-1])

print("".join([str(i) for i in p]))

#### Output ####
321

这样,您将始终拥有不同的顺序:

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]