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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在两个列表列表中查找匹配的字符串相关的知识,希望对你有一定的参考价值。

我试图创建一个函数,以便将'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

谢谢!

答案

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

  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教程。

以上是关于在两个列表列表中查找匹配的字符串的主要内容,如果未能解决你的问题,请参考以下文章

算法——蛮力法之顺序查找和蛮力字符串匹配

我需要比较python中的2个嵌套列表以查找第一个列表的字符串与第二个列表中的字符串不匹配的位置

在 Python 中查找输入字符串到元组列表的所有可能匹配项(以任何顺序/顺序)

使用 Python 有效地查找部分字符串匹配 --> 从 5 GB 文件中的值列表开始的值

如何使用模式列表在列中查找字符串并将匹配的模式添加到下一列的同一行

搜索元组列表以查找匹配子字符串的算法方法?