簡體   English   中英

從元組列表創建字典

[英]Create a dictionary from a list of tuples

我得到了一個像這樣的多個元組的列表,例如:


[(1,2,3),(1,10,11),(5,7,8)]

我的目標是獲得它:

{1:{2,3,10,11},5:{7,8}}

謝謝你讀我

謝謝,它有效,但我必須只有唯一的價值,而且我不想有列表

您可以使用defaultdict

l = [(1,2,3),(1,10,11),(5,7,8)]

from collections import defaultdict

d = defaultdict(set)
for k,*t in l:
    d[k].update(t)

或者使用 python dict我們可以使用dict.setdefault

d = dict()
for k,*t in l:
    d.setdefault(k, set()).update(t)

print(d)
{1: {10, 11, 2, 3}, 5: {8, 7}}

您可以執行以下操作:

  • 遍歷列表中的每個元組,例如 (1, 2, 3) ( for t in l
  • 然后檢查元組中的第一個元素是否在字典中,即字典已經有一個具有該值的鍵? if t[0] in s
  • 如果是,則使用元組中不包括第一個元素的新元素更新該值 - 因為第一個元素是鍵( s[t[0]].update(set(t[1:]))
  • 它不是,然后在字典中創建一個項目,key = first element and value = set(剩余元素) ( s[t[0]] = set(t[1:]) )
    l = [(1,2,3),(1,10,11),(5,7,8)]
    s = {}
    for t in l:
      if t[0] in s:
        s[t[0]].update(set(t[1:])) 
      else:
        s[t[0]] = set(t[1:])
    print(s)

輸出:

{1: {10, 11, 2, 3}, 5: {8, 7}}

如果您希望對字典中每個項目的集合(值)進行排序,您可以使用ordered-set或對OrderedDict一些操作

例如:

tuples=[(1,2,3),(1,4,5),(2,4,7)]
keys=set([i[0] for i in tuples])
result={}
for key in keys:
    dummy=[]
    for t in tuples:
        if t[0]==key:
            dummy.append(t[1:])
    result[key]=dummy

編輯:減少循環

result={}
for k, *t in tuples:
    if k not in result:
        result[k] = t
    else:
        result[k].extend(t)

這是使用pandas的單行解決方案:

import pandas as pd

lst = [(1, 2, 3), (1, 10, 11), (5, 7, 8)]

result = (pd.DataFrame(lst).groupby(0).agg(set)
            .apply(lambda x: x[1].union(x[2]), axis=1).to_dict())

基本上,首先您將所有具有相同第一個元素的元組分組。 然后用元組的剩余元素構建集合。 您在共享第一個元素的集合上使用union操作。 最后,您從生成的數據幀構建字典。

結果如下:

>>> result
{1: {11, 3, 2, 10}, 5: {8, 7}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM