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

时间:2018-03-01 14:08:46

标签: python string list random

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

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

例如,如果'one'被指定为'J090'并且'two'被指定为'MA78',那么它们将被分配新的值,如'roundTwo'所示:

  

['JO90','1','MA78','8']

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

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

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 个答案:

答案 0 :(得分:0)

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

  1. nextList
  2. 随机取两个值
  3. 检查它们是否与roundTwo
  4. 中的一对匹配
  5. 检查结果:
    • 如果他们匹配,请将其从nextList
    • 中删除
    • 如果 匹配,请选择另外两个
  6. 但你真的只是选择另外两个吗?或者你的意思是回到第1步并重复直到你得到两个不匹配的东西?或者你不选择另外两个?

    您的错误来自于循环nextList以获取i值(例如&#39; JO90&#39;,&#39; MA78&#39;)然后尝试查看这些作为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. 随机取两个值
    3. 检查它们是否与roundTwo
    4. 中的一对匹配
    5. 检查结果:
      • 如果他们匹配,请将其从nextList
      • 中删除
      • 如果 匹配,请重新开始步骤1.
    6. 然后这段代码应该有效:

      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语句,我建议您阅读Python教程:{ {3}}