2017-02-03 88 views
1

我想比較兩個列表中相同的索引相同的元素。這個想法是驗證兩個列表是否在同一個索引處包含相同的元素。如果是的話,我想統計這種情況。這是我的代碼:比較兩個列表中相同的條目在相同的地方

count = 0 
a = ['.ps2\n >|<4 *|*.ps2xml', '.c\n >|<2 *|*.wsc', '.h\n >|<2 *|*.wsh', '.c\n >|<2 *|*.chm', '.h\n >|<2 *|*.hta' ] 
b = ['.ps2xml', '.chm', '.hta'] 

for x in a: 
    for y in b: 
    if y==x[x.index(" *|*")+4:]: 
    print "match" 
    count += 1 

print count 

這給了我一個數3.我期望的是1,因爲只有b的第一個元素與第一個元素匹配。這兩個列表的第二個元素不同。第三個要素也不同。 b中的其餘元素不應該計算在內,因爲在b中沒有這樣的索引。

希望它是有道理的。由於

+1

這裏的匹配模式究竟是什麼? – ospahiu

+1

如何a [0] == b [0]'? –

+1

@MoinuddinQuadri:如果我理解正確,op使用一種「特殊」方式通過首先找到一個模式('「* | *」')進行匹配,並查看它是否跟隨查詢。 –

回答

2

在這種情況下,你應該不使用嵌套循環(因爲這意味着你將重複搜索超過ba每一行); 但使用zip(..)

for x,y in zip(a,b): 
    if y==x[x.index(" *|*")+4:]: 
     print "match" 
     count += 1 

print count 

zip需要一些迭代器和生成的元組。可以這麼說,因此在這種情況下第012元組因此是(a[i],b[i])

+0

謝謝。我不知道郵編。將閱讀更多。 – user2061944

1
使用 min()函數( 得到比較的序列的極限尺寸)

短溶液:

for i in range(min([len(a), len(b)])): 
    if (a[i][a[i].index('*|*') + 3:] == b[i]): 
     count += 1 

print(count) 

輸出:

1 
1

不匹配必須被限定爲以下'*|*'

如果沒有,那麼很簡單就是:

sum([1 for e, f in zip(a, b) if f in e]) 

或蟒蛇的後續版本,其中迭代ARG遊戲自動解壓縮:

sum(f in e for e, f in zip(a, b)) # relies on bools True, False = ints 1, 0 

如果比賽只是最後一點,你可能分裂

'.ps2\n >|<4 *|*.ps2xml'.split(" *|*") 
Out[13]: ['.ps2\n >|<4', '.ps2xml'] 

'.ps2\n >|<4 *|*.ps2xml'.split(" *|*")[1] 
Out[14]: '.ps2xml' 

sum([1 for e, f in zip(a, b) if f in e.split(" *|*")[1]]) 

雖然sum()更「有意」len()可用於速度優勢,因爲它不必遍歷列表