dikte etmek için piton tuple


149

Grup için t = ((1, 'a'),(2, 'b')) dict(t)geri döner{1: 'a', 2: 'b'}

{'a': 1, 'b': 2}Almanın iyi bir yolu var mı (anahtarlar ve valler değiştirildi)?

Sonuçta, 1verilen 'a'ya da 2verilen bir şekilde geri dönmek istiyorum 'b', belki de bir diksiyona dönüştürmek en iyi yol değildir.

Yanıtlar:


277

Deneyin:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}

8
+1 Güzel !, zip ile denemek zorunda kaldım dict(zip(*zip(*t)[::-1])). Bu daha yavaş, daha çirkin ve daha fazla bellek kullanıyor.
kevpie

@kevpie Python ile ilgili en güzel şey, bir şeylerin nasıl yapılacağını ifade etmenin yüz yolu olması, her biri bir sonraki kadar ilginç.
bjd2385

Harika, eğer sahip olduğunuz bir üçlü ise: dict((x, y) for x, y, z in t)veya dict((x, (y, z)) for x, y, z in t)ikinci ve üçüncü değerleri bir demet olarak almak için.
guival

Çok hızlı, kapsamlı ve basit. Mükemmel cevap.
gies0r

73

Biraz daha basit bir yöntem:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict(map(reversed, t))
{'a': 1, 'b': 2}

1
bunu daha hızlı yapan nedir?
maazza

9
Harita ve dikte işlevleri C
dilinde

1
Bunu reverseaçıkça dile getirdim .
Frerich Raabe

4
@maazza: performans testleri genel olarak (en azından C uygulamasında) mapeşlenen şeyin başka bir yerleşik işlev ( ör.) olduğu zaman bir anlamadan daha hızlı olduğunu gösterir reversed; diğer çoğu durumda, tam tersi doğrudur. Ama tahmin etmek profil yapmak daha iyi :)
Karl Knechtel

43

Python 2.7 kullanıyorsanız daha da özlü:

>>> t = ((1,'a'),(2,'b'))
>>> {y:x for x,y in t}
{'a':1, 'b':2}

9
>>> dict([('hi','goodbye')])
{'hi': 'goodbye'}

Veya:

>>> [ dict([i]) for i in (('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14)) ]
[{'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}]

Bu cevabın OP'nin sorusuna nasıl
baktığını

4

Aynı anahtar için birden çok değer varsa, aşağıdaki kod bu değerleri anahtarlarına karşılık gelen bir listeye ekler,

d = dict()
for x,y in t:
    if(d.has_key(y)):
        d[y].append(x)
    else:
        d[y] = [x]

2

İşte bunu yapmanın birkaç yolu:

>>> t = ((1, 'a'), (2, 'b'))

>>> # using reversed function
>>> dict(reversed(i) for i in t)
{'a': 1, 'b': 2}

>>> # using slice operator
>>> dict(i[::-1] for i in t)
{'a': 1, 'b': 2}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.