在两个列表列表中查找匹配的字符串

问题描述 投票:0回答:1

我试图创建一个函数,以便将'next'列表中的随机值分配给'One'和'Two'。如果分配给'One'和'Two'的值与'roundTwo'中值[i] [0]和[i] [2]的位置一致,则为'One'和'Two'分配新值。

然后,从“下一个”列表中删除值“1”和“2”。

例如,如果'one'被指定为'J090'而''two'被指定为'MA78',那么它们都将被赋予新的值,如'roundTwo'所示:

[اجوص0,ء1ء,أمحقئ,قضا]

但是,如果'one'被分配'J090'并且'two'被分配'B208'那么它将是正确的,然后程序将继续从'next'列表中删除'J090'和'B208'。

下面是我的代码示例,如果我写的内容在这里没有太多意义,请道歉,所以只要问你是否认为它需要编辑!

nextList = ['JO90', 'MA78', 'FE29', 'HT27', 'EQ37', 'BF50', 'LJ93', 'UT21', 'KJ40', 'WE82', 'WQ28', 'BV98', 'FE32', 'EF10', 'SA14', 'SP16']
roundTwo = [['JO90', '1', 'MA78', '8'], ['B208', '2', 'DF18', '3'], ['PD06', '5', 'BS07', '7'], ['SA14', '4', 'SP16', '7']]
one = nextList[random.randint(0, len(nextList) - 1)]
two = nextList[random.randint(0, len(nextList) - 1)]
for i in nextList:
    if one in roundTwo[i][0] and two in roundTwo[i][2]:  
        one = roundTwo[random.randint(0, len(roundTwo) - 1)]
        two = roundTwo[random.randint(0, len(roundTwo) - 1)]
if one in nextList:
    nextList.remove(one)
if two in nextList:
    nextList.remove(two)

我在运行时遇到此错误,我不太确定如何使其正常工作:

如果一个在roundTwo [i] [0]和两个在roundTwo [i] [2]:

TypeError:list indices必须是整数或切片,而不是str

谢谢!

python string list random
1个回答
0
投票

因此,如果我已正确理解这一点,您的函数将执行以下操作:

  1. nextList随机取两个值
  2. 检查它们是否与roundTwo配对
  3. 检查结果: 如果它们不匹配,请从nextList中删除它们 如果匹配,请选择另外两个

但你真的只是选择另外两个吗?或者你的意思是回到第1步并重复直到你得到两个不匹配的?或者你不选择另外两个?


您的错误来自于循环nextList以获取您的i值(例如'JO90','MA78'),然后尝试在roundTwo列表中查找这些作为索引。如果你想循环遍历roundTwo中的所有4个小集合进行检查,那么你的脚本应该是这样的:

for item in roundTwo:  # eg item = ['JO90', '1', 'MA78', '8']
    if one == item[0] and two == item[2]:
        # choose new one and two

如果他们匹配来自roundTwo的一对,你的功能目前似乎试图从roundTwo列表中以某种方式选择替代品,但我认为这是一个错字,应该是nextList,但不知道你的功能正在做什么的更多细节我可以'说。


如果我能猜到你的算法应该做以下事情:

  1. nextList随机取两个值
  2. 检查它们是否与roundTwo配对
  3. 检查结果: 如果它们不匹配,请从nextList中删除它们 如果匹配,请重新开始步骤1。

然后这段代码应该工作:

import random

nextList = ['JO90', 'MA78', 'FE29', 'HT27', 'EQ37', 'BF50', 'LJ93', 'UT21', 'KJ40', 'WE82', 'WQ28', 'BV98', 'FE32', 'EF10', 'SA14', 'SP16']
roundTwo = [['JO90', '1', 'MA78', '8'], ['B208', '2', 'DF18', '3'], ['PD06', '5', 'BS07', '7'], ['SA14', '4', 'SP16', '7']]

while True:
    # choose one and two at random
    one = nextList[random.randint(0, len(nextList) - 1)]
    two = nextList[random.randint(0, len(nextList) - 1)]
    # loop over every set in roundTwo
    for i in roundTwo:
        # check whether one and two match
        if one == i[0] and two == i[2]:
            print "Bad pair: {0}, {1}".format(one, two)
            # break out of for loop
            # will hit end of while loop and start again
            break
    # got to end of for loop without breaking, so *didn't* match pair in roundTwo
    else:
        print "Good pair: {0}, {1}".format(one, two)
        nextList.remove(one)
        nextList.remove(two)
        # we found a good pair, so can break out of the while loop
        break

如果onetwo同样出现,这将产生错误。如果您希望它们不同,您可以在选择后立即添加检查:

if one == two:
    print "They're the same"
    continue

continue将跳回while循环的开始。

或者如果你被允许拥有相同的,你需要在你删除它们之前添加一个检查它们是否在nextList中(就像你在原始脚本中那样)但你只需要检查two - 至少one应该总是在列表中:

nextList.remove(one)
if two in nextList:
    nextList.remove(two)

这使用了for-else构造:如果你完成了for循环并且没有更快地完成它,那么Python将执行else分支。这个else分支包含一个break语句,以摆脱while True循环,否则将永远循环。如果您之前没有遇到while True循环,或者else分支在for循环或break语句:https://docs.python.org/2/tutorial/controlflow.html,我建议您阅读Python教程。

© www.soinside.com 2019 - 2024. All rights reserved.