簡體   English   中英

將字典中的相似值分組

[英]Grouping similar values in a dictionary

我是編程新手,如果有人可以在Python / Pandas中提供以下幫助,我將不勝感激。 我有一本字典,其中有一個列表作為值。 我希望能夠將具有相似值的鍵組合在一起。 我在這里看到過類似的問題,但是在這種情況下,我要忽略的是例如值的順序:

classmates={'jack':['20','male','soccer'],'brian':['26','male','tennis'],'charles':['male','soccer','20'],'zulu':['19','basketball','male']}

jack和charles具有相同的值,但順序不同。 我想要的輸出將給出與順序無關的值。 在這種情況下,輸出將被寫為csv

['20','male','soccer']: jack, charles
['26','male','tennis']: brian
['19','basketball','male']: zulu

使用frozensetsapplygroupby + agg

s = pd.DataFrame(classmates).T.apply(frozenset, 1)

s2 = pd.Series(s.index.values, index=s)\
          .groupby(level=0).agg(lambda x: list(x))

s2
(soccer, 20, male)        [charles, jack]
(26, male, tennis)                [brian]
(basketball, male, 19)             [zulu]
dtype: object

您可以使用以下代碼以所需的方式反轉字典:

classmates={'jack':['20','male','soccer'],'brian':['26','male','tennis'],'charles':['male','soccer','20'],'zulu':['19','basketball','male']}

out_dict = {}
for key, value in classmates.items():
    current_list = out_dict.get(tuple(sorted(value)), [])
    current_list.append(key)
    out_dict[tuple(sorted(value))] = current_list

print(out_dict)

此打印

{('20', 'male', 'soccer'): ['charles', 'jack'], ('26', 'male', 'tennis'): ['brian'], ('19', 'basketball', 'male'): ['zulu']}
from collections import defaultdict

ans = defaultdict(list)

classmates={'jack':['20','male','soccer'],
            'brian':['26','male','tennis'],
            'charles':['male','soccer','20'],
            'zulu':['19','basketball','male']
           }


for k, v in classmates.items():
    sorted_tuple = tuple(sorted(v))
    ans[sorted_tuple].append(k)

# ans is: a dict you desired
# defaultdict(<class 'list'>, {('20', 'male', 'soccer'): ['jack','charles'],
# ('26', 'male', 'tennis'): ['brian'], ('19', 'basketball', 'male'): ['zulu']})

for k, v in ans.items():
    print(k, ':', v)

# output: 
# ('20', 'male', 'soccer') : ['jack', 'charles']
# ('26', 'male', 'tennis') : ['brian']
# ('19', 'basketball', 'male') : ['zulu']

首先,將字典轉換為pandas數據框。

df= pd.DataFrame.from_dict(classmates,orient='index')

然后按年齡升序排列。

df=df.sort_values(by=0,ascending=True)

這里0是默認的列名。 您可以重命名此列名稱。

您可以在一行中完成此操作:

print({tuple(sorted(v)) : [k for k,vv in a.items() if sorted(vv) == sorted(v)] for v in a.values()})

要么

這是詳細的解決方案:

dict_1 = {'jack': ['20', 'male', 'soccer'], 'brian': ['26', 'male', 'tennis'], 'charles': ['male', 'soccer', '20'],
     'zulu': ['19', 'basketball', 'male']}

sorted_dict = {}
for key,value in dict_1.items():
    sorted_1 = sorted(value)
    sorted_dict[key] = sorted_1

tracking_of_duplicate = []
final_dict = {}
for key1,value1 in sorted_dict.items():
    if value1 not in tracking_of_duplicate:
        tracking_of_duplicate.append(value1)
        final_dict[tuple(value1)] = [key1]

    else:

        final_dict[tuple(value1)].append(key1)

print(final_dict)

暫無
暫無

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

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