我试图创建一个函数,以便将'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
谢谢!
答案 0 :(得分:0)
因此,如果我已正确理解这一点,您的功能将执行以下操作:
nextList
roundTwo
nextList
但你真的只是选择另外两个吗?或者你的意思是回到第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
,但不知道你的功能在做什么的更多细节我不能说。
如果我猜测你的算法应该做以下事情:
nextList
roundTwo
nextList
然后这段代码应该有效:
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
语句,我建议您阅读Python教程:{ {3}}