사전의 값과 키를 교환하려면 어떻게 해야 합니까?
사전을 입력으로 받고, 키가 입력의 값이 되고 값이 해당 입력 키가 되는 사전을 반환하려고 합니다.값은 고유합니다.
예를 들어, 다음과 같이 입력합니다.
a = dict()
a['one']=1
a['two']=2
다음과 같이 출력했으면 합니다.
{1: 'one', 2: 'two'}
명확하게 하기 위해 제 결과가 다음과 같았으면 합니다.
res = dict()
res[1] = 'one'
res[2] = 'two'
이것을 달성할 수 있는 깔끔한 파이썬 방법이 있습니까?
파이썬 2:
res = dict((v,k) for k,v in a.iteritems())
파이썬 3(@erik 덕분):
res = dict((v,k) for k,v in a.items())
new_dict = dict(zip(my_dict.values(), my_dict.keys()))
3.0+를 포함한 Python 2.7 이후 버전에서는 거의 틀림없이 더 짧고 읽기 쉬운 버전이 있습니다.
>>> my_dict = {'x':1, 'y':2, 'z':3}
>>> {v: k for k, v in my_dict.items()}
{1: 'x', 2: 'y', 3: 'z'}
파이썬 3
res = {v: k for k, v in a.items()}
파이썬 2
res = {v: k for k, v in a.iteritems()}
3의 편됨: 파의썬 3경사를 합니다.a.items()
에 a.iteritems()
이들 간의 차이점에 대한 논의는 SO의 Python에 있는 항목에서 확인할 수 있습니다.
In [1]: my_dict = {'x':1, 'y':2, 'z':3}
파이썬 3
In [2]: dict((value, key) for key, value in my_dict.items())
Out[2]: {1: 'x', 2: 'y', 3: 'z'}
파이썬 2
In [2]: dict((value, key) for key, value in my_dict.iteritems())
Out[2]: {1: 'x', 2: 'y', 3: 'z'}
현재 선행 답변에서는 값이 항상 그렇지는 않은 고유한 것으로 가정합니다.값이 고유하지 않으면 어떻게 합니까?정보가 유출됩니다!예:
d = {'a':3, 'b': 2, 'c': 2}
{v:k for k,v in d.iteritems()}
아온다를 합니다.{2: 'b', 3: 'a'}
.
에 대한 입니다.'c'
완전히 무시당했습니다.이상적으로는 다음과 같은 것이어야 합니다.{2: ['b','c'], 3: ['a']}
이것이 바로 하부 구현이 수행하는 작업입니다.
파이썬 2.x
def reverse_non_unique_mapping(d):
dinv = {}
for k, v in d.iteritems():
if v in dinv:
dinv[v].append(k)
else:
dinv[v] = [k]
return dinv
파이썬 3.x
def reverse_non_unique_mapping(d):
dinv = {}
for k, v in d.items():
if v in dinv:
dinv[v].append(k)
else:
dinv[v] = [k]
return dinv
res = dict(zip(a.values(), a.keys()))
시도해 볼 수 있습니다.
파이썬 3
d={'one':1,'two':2}
d2=dict((value,key) for key,value in d.items())
d2
{'two': 2, 'one': 1}
파이썬 2
d={'one':1,'two':2}
d2=dict((value,key) for key,value in d.iteritems())
d2
{'two': 2, 'one': 1}
만약 당신이 사전을 '역전'할 수 없다면 주의하세요.
- 둘 이상의 키가 동일한 값을 공유합니다.를 들어 를들면입니다.
{'one':1,'two':1}
에는 키가 이 하나만 수 .1
. - 하나 이상의 값을 해시할 수 없습니다.를 들어 를들면입니다.
{'one':[1]}
.[1]
유효한 값이지만 유효한 키가 아닙니다.
주제에 대한 토론은 파이썬 메일링 목록에서 이 스레드를 참조하십시오.
new_dict = dict( (my_dict[k], k) for k in my_dict)
Python 3에서만 작동합니다.
new_dict = { my_dict[k]: k for k in my_dict}
Ilya Prokin의 응답을 확장하는 또 다른 방법은 실제로 사용하는 것입니다.reversed
기능.
dict(map(reversed, my_dict.items()))
)로 됩니다..items()
각이며, 항목은 "" "/" "" " " " "로 .reversed
기능다. 이 이음으전때달로 때.dict
생성자가 원하는 값/키 쌍으로 변환합니다.
하비에르의 답변에 대한 개선 제안:
dict(zip(d.values(),d))
에 에.d.keys()
당신은 그냥 쓸 수 있습니다.d
왜냐하면 만약 당신이 반복기로 사전을 뒤지면, 그것은 관련 사전의 키를 돌려줄 것이기 때문입니다.
예: 이 동작의 경우:
d = {'a':1,'b':2}
for k in d:
k
'a'
'b'
사전 이해를 통해 쉽게 수행할 수 있습니다.
{d[i]:i for i in d}
dict(map(lambda x: x[::-1], YourDict.items()))
.items()
의 튜플 목록을 반환합니다.(key, value)
.map()
목록의 요소를 검토하고 적용합니다.lambda x:[::-1]
각 요소(태플)가 반대로 되도록 각 튜플은(value, key)
지도에서 벗어난 새로운 목록에서.마침내.dict()
새 목록에서 받아쓰기를 만듭니다.
Hanan의 대답은 더 일반적인 경우를 다루고 있기 때문에 정답입니다(다른 대답은 중복 상황을 모르는 사람에게는 다소 오해의 소지가 있습니다).Hanan의 답변에 대한 개선점은 setdefault를 사용하는 것입니다.
mydict = {1:a, 2:a, 3:b}
result = {}
for i in mydict:
result.setdefault(mydict[i],[]).append(i)
print(result)
>>> result = {a:[1,2], b:[3]}
루프 사용:-
newdict = {} #Will contain reversed key:value pairs.
for key, value in zip(my_dict.keys(), my_dict.values()):
# Operations on key/value can also be performed.
newdict[value] = key
Python3를 사용하는 경우에는 약간 다릅니다.
res = dict((v,k) for k,v in a.items())
인플레이스 솔루션 추가:
>>> d = {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>> for k in list(d.keys()):
... d[d.pop(k)] = k
...
>>> d
{'two': 2, 'one': 1, 'four': 4, 'three': 3}
Python3에서 사용하는 것은 매우 중요합니다.list(d.keys())
왜냐면dict.keys
키 보기를 반환합니다.Python2를 사용하고 있다면,d.keys()
충분합니다.
저는 이 버전이 가장 포괄적이라고 생각합니다.
a = {1: '하나', 2: '둘'}
swapd_a = {value : 키, a.value}의 값
인쇄(print_a)
출력: {'one': 1, 'two': 2}
(제 생각에는) 다른 답변들처럼 읽을 수 없는 대안이 있습니다.
new_dict = dict(zip(*list(zip(*old_dict.items()))[::-1]))
어디에list(zip(*old_dict.items()))[::-1]
2개의 튜플 목록을 제공합니다.old_dict
의 값과 키가 각각 표시됩니다.
언급URL : https://stackoverflow.com/questions/1031851/how-do-i-exchange-keys-with-values-in-a-dictionary
'programing' 카테고리의 다른 글
SpringCloud Gateway - 수신 요청 URL 및 해당 경로 URI 기록 (0) | 2023.07.18 |
---|---|
Tensorflow - ValueError: NumPy 배열을 Tensor로 변환하지 못했습니다(지원되지 않는 개체 유형 플로트). (0) | 2023.07.18 |
장고 1.7은 장고.core.exceptions를 던집니다.AppRegistryNotReady: 모델이 아직 로드되지 않았습니다. (0) | 2023.07.18 |
Oracle에서 데이터베이스 개체가 테이블 또는 보기인지 확인하는 방법 (0) | 2023.07.18 |
단순 문자열로 시간 델타 객체를 구성하는 방법 (0) | 2023.07.18 |