2011-02-04 15 views
10

Python'daki Sözlükler hakkında soru var.Dicts ile aynı değere sahip tüm Anahtar Unsurları Bul

işte burada:

ben Şimdi ben aynı değere bütün Anahtar Element almak ve yeni bir dict kaydetmek istediğiniz dict = { 'abc':'a', 'cdf':'b', 'gh':'a', 'fh':'g', 'hfz':'g' }

gibi dicti var. bunlar yerine yeni sözlükteki dizilerini listeleri ile ince ise kaçınmak istiyorsanız

new_dict = { 'b':('cdf'), 'a':('abc','gh'), 'g':('fh','hfz')}

+6

"Dict" öğesini, yerleşik bir işlevin adı olduğundan, bir değişken adı olarak kullanmayın. –

cevap

20

, sen

from collections import defaultdict 
some_dict = { 'abc':'a', 'cdf':'b', 'gh':'a', 'fh':'g', 'hfz':'g' } 
new_dict = defaultdict(list) 
for k, v in some_dict.iteritems(): 
    new_dict[v].append(k) 

kullanabilirsiniz: gibi

yeni Dict bakmak gerekir defaultdict kullanılması, ayrıca yapabilirdi

new_dict = {} 
for k, v in some_dict.iteritems(): 
    new_dict.setdefault(v, []).append(k) 
2

İşte saf bir uygulama. Daha iyi Python becerilerine sahip biri, muhtemelen daha özlü ve harika olabilir.

dict = { 'abc':'a', 'cdf':'b', 'gh':'a', 'fh':'g', 'hfz':'g' } 

new_dict = {} 
for pair in dict.items(): 
    if pair[1] not in new_dict.keys(): 
     new_dict[pair[1]] = [] 

    new_dict[pair[1]].append(pair[0]) 

print new_dict 

Bu özellikle yeni sözlükte değerler olarak dizilerini istiyorsun, yine defaultdict kullanın ve tanımlama grubu birleştirme kullanabilirsiniz

{'a': ['abc', 'gh'], 'b': ['cdf'], 'g': ['fh', 'hfz']} 
0

üretir. Bu çözüm Python 3.4+ çalışır:

from collections import defaultdict 

source = {'abc': 'a', 'cdf': 'b', 'gh': 'a', 'fh': 'g', 'hfz': 'g'} 
target = defaultdict(tuple) 

for key in source: 
    target[source[key]] += (key,) 

print(target) 

Hangi

defaultdict(<class 'tuple'>, {'a': ('abc', 'gh'), 'g': ('fh', 'hfz'), 'b': ('cdf',)}) 

Bu muhtemelen liste ekleme ile bir sözlük oluştururken daha yavaş olacaktır üretecek ve toplanacak fazla nesne yaratacaktır. Yukarıdaki aynı sonucu verecektir

target2 = defaultdict(list) 

for key in source: 
    target2[source[key]].append(key) 

for key in target2: 
    target2[key] = tuple(target2[key]) 

print(target2) 

: Yani, küpe içine eşlemek sonra listelerin dışarı sözlüğünü inşa edebilir.