사전을 튜플 목록으로 변환하려면 어떻게해야합니까?


219

내가 같은 사전을 가지고 있다면 :

{ 'a': 1, 'b': 2, 'c': 3 }

이것을 어떻게 변환 할 수 있습니까?

[ ('a', 1), ('b', 2), ('c', 3) ]

어떻게 변환 할 수 있습니까?

[ (1, 'a'), (2, 'b'), (3, 'c') ]

7
[tuple(reversed(x)) for x in d.items()]
garej

1
@garej : 주어진 코드에 x이미 tuple있습니다 ( itemsiterable의 iterable을 만드는 특성입니다 tuple) [x[::-1] for x in d.items()]. 단순히 수행하는 것이 더 간단하고 빠릅니다 . 반전 슬라이스 는 반복자 로부터 생성자가 반복적으로 채워지도록 (끝에 과도하게 할당되고 크기가 조정되는) tuple것이 아니라 적절한 크기 의 반전 을 직접 구성 합니다. tupletuplereversed
ShadowRanger 2016 년

@ShadowRanger, 당신 말이 맞아요. 나는 k, v그런 경우에 항상 패턴 이 필요하지 않다는 것을 분명히하고 싶었습니다 .
garej

참고 :compatibility py2.x로 인해 태그 추가 // py3.x 차이점
dreftymac

답변:


360
>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> d.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]

원하는 순서가 아니지만 어쨌든 특정 순서는 없습니다. 1 정렬하거나 필요에 따라 구성하십시오.

참조 : items () , iteritems ()


Python 3.x에서는 iteritems(더 이상 존재하지 않음)를 사용하지 않고 대신을 사용 items하여 "보기"를 사전 항목에 반환합니다. Python 3.0 의 새로운 기능 문서 및 뷰에 대한 새로운 문서를 참조하십시오 .

1 : dicts에 대한 삽입 순서 보존 이 Python 3.7추가되었습니다.


8
items ()는 python3에서 dict_keys 뷰를 반환합니다. 이 호출을 캐스트 "list ()"로 캐스트하십시오. @SilentGhost의 답변보기
Erich

55

아무도하지 않았으므로 py3k 버전을 추가합니다.

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> list(d.items())
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.items()]
[(1, 'a'), (3, 'c'), (2, 'b')]


10

명명 된 튜플 목록 만들기

namedtuple 을 사용하는 것이 종종 편리 할 수 ​​있습니다 . 예를 들어 다음과 같은 값으로 'name'사전을 키로, 'score'사전을 갖습니다.

d = {'John':5, 'Alex':10, 'Richard': 7}

튜플로 항목을 나열하고 원하는 경우 정렬하고 이름과 점수를 얻을 수 있습니다.

>>> player = best[0]

>>> player.name
        'Alex'
>>> player.score
         10

이를 수행하는 방법 :

무작위 순서로 또는 컬렉션 순서를 유지합니다 .

import collections
Player = collections.namedtuple('Player', 'name score')
players = list(Player(*item) for item in d.items())

순서대로 값 ( '점수')으로 정렬 :

import collections
Player = collections.namedtuple('Player', 'score name')

가장 낮은 점수로 먼저 정렬 :

worst = sorted(Player(v,k) for (k,v) in d.items())

가장 높은 점수로 먼저 정렬 :

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)

7

원하는 것은 dictitems()iteritems()방법입니다. items(키, 값) 튜플 목록을 반환합니다. 튜플은 변경할 수 없으므로 되돌릴 수 없습니다. 따라서 반전 된 (값, 키) 튜플을 얻으려면 항목을 반복하고 새 튜플을 만들어야합니다. 반복의 iteritems경우 전체 목록을 메모리에 유지하지 않고 생성기를 사용하여 (키, 값) 튜플을 생성하므로 바람직합니다.

Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = { 'a': 1, 'b': 2, 'c': 3 }
>>> a.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v,k) for (k,v) in a.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]
>>> 


5

이것들은 Python 3.x와 Python 2.x의 주요 변경 사항입니다.

Python3.x 사용

dictlist = []
for key, value in dict.items():
    temp = [key,value]
    dictlist.append(temp)

Python 2.7의 경우

dictlist = []
for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)

4
>>> a = { 'a': 1, 'b': 2, 'c': 3}

>>> a.keys ()에서 x에 대한 [(x, a [x])]
[( 'a', 1), ( 'c', 3), ( 'b', 2)]

>>> [(a [x], x) x에서 a.keys ()]
[(1, 'a'), (3, 'c'), (2, 'b')]

4

에 의하여 keys()values()방법 사전 및 zip.

zip 정렬 된 사전처럼 작동하는 튜플 목록을 반환합니다.

데모:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> zip(d.keys(), d.values())
[('a', 1), ('c', 3), ('b', 2)]
>>> zip(d.values(), d.keys())
[(1, 'a'), (3, 'c'), (2, 'b')]

이것은 collections.OrderedDict()여러 버전의 Python HTTP Requests lib에서 더 잘 작동 하는 대안으로 저에게 효과적이었습니다. zip함수 이름이 다소 모호하거나 과부하 된 것으로 싫어하지만 .
MarkHu

메모 zip-ification 중첩 된 자녀가있는 경우, 그들은 영향을받을 실 거예요 즉, "깊은"캐스팅하지 않습니다. 자신의 재귀를 굴려야 할 수도 있습니다.
MarkHu

3
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list

2
이 코드는 문제를 해결하는 데 도움이 될 수 있지만 질문에 그리고 / 또는 어떻게 대답 하는지 는 설명하지 않습니다 . 이러한 추가 맥락을 제공하면 장기 교육 가치가 크게 향상 될 것입니다. 제발 편집 제한 및 가정이 적용되는 것을 포함하여, 설명을 추가 답변을.
Toby Speight

3

더 간단한 것은

list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (key, value) tuples

두 번째는 더 간단하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.