2011-05-24 100 views
1

更新:比較字典值在Python在同一個字典的每個鍵

大家好。我的問題是,我如何比較字典的值是否相等。更多信息詳細信息我的字典:

  • 鍵會話號每個按鍵的
  • 值嵌套的列表 - > F.E.

    [[1,0],[2,0],[3,1]

  • 值的每個鍵的長度的arent一樣的,所以它可能是會話編號1具有多個值然後會話編號2

  • 這裏的示例字典:

order_session = {1:[[100,0],[22,1],[23,2],10:[ 100,0],[232,0],[10,2],[11,2]],22:[[5,2],[23,2],...], ...}

我的目標:

步驟1:與整個其他會話數的值,在字典中的會話數1的值進行比較平等

步驟2:取下屆會議號碼和值與其他會話號的其他值進行比較,等等 - 最後我們每個會話數的值進行比較

第3步:將結果保存到列表f.e. 輸出= [[100,0],[23,2],...]或輸出= [(100,0),(23,2),...]

  • 如果你能看到會話1和10的值對[100,0]是相同的。會話1和22的價值對[23,2]也是一樣的。

感謝您的幫助。

更新2

感謝您對所有您的幫助和提示,以更改列表的嵌套列表到元組,這是相當更好地處理它的名單。我也喜歡使用collections.Counter()...不幸的是,我使用2.6.4(計數器工作在2.7),也許我有時會改爲2.7。

+1

列表 「我怎樣才能實現這個結果?」首先,寫一個更加清晰的解釋,說明一個人如何通過字典,比較這些「值對」來產生輸出。請撰寫分步指導,這些指導非常簡單。不是一個總結,而是一步一步的(「先做這件事,然後做下一件事」)。當你這樣做的時候,我們可以展示如何在用英文寫他們之後用Python編寫分步說明。請**更新**問題,並按照分步說明進行此匹配。 – 2011-05-24 10:31:02

+1

你可能會發現,如果你可以使用元組列表,例如。 '[(100,0),(22,1),(23,2)]' – 2011-05-24 10:35:32

+0

是不止一次出現的所有值對的輸出?訂單重要嗎? – 2011-05-24 10:37:07

回答

2

如果你的詞典是漫長的,你會想用套,獲得更好的性能(在列表中查找已經遇到的值將是相當緩慢):

def get_repeated_values(sessions): 
    known = set() 
    already_repeated = set() 
    for lst in sessions.itervalues(): 
     session_set = set(tuple(x) for x in lst) 
     repeated = (known & session_set) - already_repeated 
     already_repeated |= repeated 
     known |= session_set 
     for val in repeated: 
      yield val 

sessions = {1:[[100,0],[22,1],[23,2]],10:[[100,0],[232,0],[10,2],[11,2]],22:[[5,2],[23,2]]} 
for x in get_repeated_values(sessions): 
    print x 

我也建議(再次,出於性能原因)將元組嵌套到列表中而不是列表中,如果您不打算立即更改它們的話。我在這裏發佈的代碼將以任何方式工作,但如果這些值已經是元組,它會更快。

+0

這裏聰明地使用set操作;) – peufeu 2011-05-24 10:54:00

+0

謝謝你的解決方案。我更喜歡這個,因爲我列表中有很多項目。並感謝提示將其更改爲元組而不是列表。 – SnowBallz 2011-05-24 19:51:52

0

有可能做到這一點一個更好的和更優化的方式,但我的工作我的方式從這裏:

seen = [] 
output = [] 

for val in order_session.values(): 
    for vp in val: 
     if vp in seen: 
      if not vp in output: 
       output.append(vp) 
     else: 
      seen.append(vp) 

print(output) 

基本上,這是什麼做的是通過所有的值看,如果該值之前已經看到過,但之前沒有輸出,它被附加到輸出。

注意這與實際值值對 - 如果你有導致指針各種對象,我的算法可能會失敗(我沒有測試過,所以我不知道) 。 Python對「低」整數重新使用相同的對象引用;也就是說,如果您在後面運行語句a = 5b = 5,則ab將指向相同的整數對象。但是,如果您將它們設置爲10^5,則它們不會。但我不知道限制在哪裏,所以我不確定這是否適用於您的代碼。

0
>>> from collections import Counter 
>>> D = {1:[[100,0],[22,1],[23,2]], 
... 10:[[100,0],[232,0],[10,2],[11,2]], 
... 22:[[5,2],[23,2]]} 
>>> [k for k,v in Counter(tuple(j) for i in D.values() for j in i).items() if v>1] 
[(23, 2), (100, 0)] 

如果你真的需要列出

>>> [list(k) for k,v in Counter(tuple(j) for i in D.values() for j in i).items() if v>1] 
[[23, 2], [100, 0]] 
0
order_session = {1:[[100,0],[22,1],[23,2]],10:[[100,0],[232,0],[10,2],[11,2]],22:[[5,2],[23,2],[80,21]],} 
output = [] 
for pair in sum(order_session.values(), []): 
    if sum(order_session.values(), []).count(pair) > 1 and pair not in output: 
     output.append(pair) 

print output 
... 
[[100, 0], [23, 2]]