使用Python 2.7。
我有两个不同的列表,A和B(简化以使解释更清楚)。
A = [1, 2, 4, 3, 5]
B = [2, 0, 3, 2, 1]
我希望能够比较每个列表ex-A [1] v B [1]的位置值 - 并且总计A更大的实例(A“胜利”),两个值相同(A“领带”),以及B大时(A“损失”)的实例。
为了使事情变得更复杂,我还使用random.shuffle()每次通过for循环随机化列表的顺序。
我首先尝试使用:
def listComp(listA, listB):
Awins = 0
Aties = 0
Alosses = 0
for i in range(0, whatever):
random.shuffle(listA)
random.shuffle(listB)
if A[0] > B[0]:
Awins += 1
elif A[0] == B[0]:
Aties += 1
elif A[0] < B[0}:
Alosses += 1
然后在每个if语句中,编写额外的if语句以说明所有可能的变化。显然,随着列表大小的增加,这会非常耗费人力。必须有一个更简单的方法,对吗?
答案 0 :(得分:4)
听起来像你想要的zip
:
def compare(A,B):
Awins = 0
Aties = 0
Alosses = 0
for i in range(0, whatever):
random.shuffle(listA)
random.shuffle(listB)
for a,b in zip(A,B):
if a > b:
Awins += 1
elif a == b:
Aties += 1
else:
Alosses += 1
答案 1 :(得分:2)
我认为你想要zip
,也不确定你为什么要在循环内进行洗牌(然后再说一遍,我不确定你在这里完成了什么)。我会把它移到外面,因为你仍然会得到随机效果。
def listComp(listA, listB):
wins = 0
ties = 0
losses = 0
shuffle(listA)
shuffle(listB)
for a, b in zip(listA, listB):
if a < b:
wins += 1
elif a == b:
ties += 1
else:
losses += 1
return wins, ties, losses
关于zip
的一个注释,只要您提供的最短列表,它就会为您提供项目列表。例如:
zip([1, 2], ['a', 'b', 'c'])
将输出:
[(1, 'a'), (2, 'b')] # Note the missing 'c'
答案 2 :(得分:2)
要添加其他答案(并完成digivampire尝试的相同简化),您可以使用自由函数cmp
来简化比较逻辑。它返回-1,0或1,具体取决于两个值中哪一个更大。然后我们可以count
每个值的出现次数。
for i in range(0, whatever):
random.shuffle(listA)
random.shuffle(listB)
results = [cmp(a, b) for a, b in zip(listA, listB)]
Awins += results.count(1)
Aties += results.count(0)
Alosses += results.count(-1)
为了进一步采用这种方法,我们可以让Python为我们做外部循环逻辑和求和。我们的想法是使用计数结果构建长度为3的列表(使用列表推导来迭代-1..1范围),然后使用另一个列表推导来获得这些结果whatever
- 很多次,{ {1}}他们再次(制作三个胜利计数,平局计数和损失计数列表)和zip
每个列表。
sum
答案 3 :(得分:1)
我认为这不是一个糟糕的开始。我会添加一个内部for循环来帮助进行硬编码:
def listComp(listA, listB):
Awins = 0
Aties = 0
Alosses = 0
for i in range(0, whatever):
random.shuffle(listA)
random.shuffle(listB)
for j in range(0, len(listA)):
if A[j] > B[j]:
Awins += 1
elif A[j] == B[j]:
Aties += 1
elif A[j] < B[j]:
Alosses += 1
此代码示例假定listA的长度与listB的长度相同。如果不是这样,您可能需要进行一些额外的检查。
此外,可能有更好的,更“python-y”的方式。
答案 4 :(得分:0)
for i in range(0, whatever):
random.shuffle(listA)
random.shuffle(listB)
diffList = map(lambda (x,y): x-y, zip(listA,listB))
Awins_ties = sum((k > 0, k==0) for k in diffList)
Awins = Awins_ties[0]
Aties = Awins_ties[1]
Alosses = len(diffList) - Awins - Aties