[英]Comparing Values in List in For Loop; Python
使用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語句進行編碼,以說明所有可能的變化。 顯然,隨着列表數量的增加,這變得非常勞動密集。 必須有一種更簡單的方法,對嗎?
聽起來像您想要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
我認為您想使用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'
要添加其他答案(並完成與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
-多次,將它們再次zip
(以列出三個獲勝計數,並列計數和損失計數列表),並對每個列表sum
。
def trial(listA, listB):
random.shuffle(listA)
random.shuffle(listB)
results = [cmp(a, b) for a, b in zip(listA, listB)]
return [results.count(i) for i in range(-1, 2)]
Awins, Aties, Alosses = (
sum(counts)
for counts in zip(*(
trial(listA, listB) for i in range(0, whatever)
))
)
我認為這不是一個糟糕的開始。 我將添加一個內部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”方式。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.