我试图创建一个函数,以便将'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
谢谢!
因此,如果我已正确理解这一点,您的函数将执行以下操作:
nextList
随机取两个值roundTwo
配对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
,但不知道你的功能正在做什么的更多细节我可以'说。
如果我能猜到你的算法应该做以下事情:
nextList
随机取两个值roundTwo
配对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
如果one
和two
同样出现,这将产生错误。如果您希望它们不同,您可以在选择后立即添加检查:
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教程。