source

딕트를 OrderedDict로 변환하는 중

factcode 2023. 7. 18. 22:02
반응형

딕트를 OrderedDict로 변환하는 중

사용하는 데 문제가 있습니다.collections.OrderedDictclass. 저는 Raspebian에서 Python 2.7을 사용하고 있습니다. Raspebian의 Debian 디스트리뷰터는 Raspberry Pi입니다.텍스트 어드벤처를 위한 비교(병렬)를 위해 사전 두 개를 인쇄하려고 합니다.정확하게 비교하기 위해서는 순서가 필수적입니다.내가 무엇을 시도하든 사전은 보통 순서가 없는 방식으로 인쇄됩니다.

RPi에서 이 작업을 수행하면 다음과 같이 얻을 수 있습니다.

import collections

ship = {"NAME": "Albatross",
         "HP":50,
         "BLASTERS":13,
         "THRUSTERS":18,
         "PRICE":250}

ship = collections.OrderedDict(ship)

print ship
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])

함수 호출을 인쇄하고 키와 값 그룹을 중첩된 목록에 넣는 것이기 때문에 분명히 잘못된 것이 있습니다.

다음은 PC에서 유사한 기능을 실행하여 얻은 것입니다.

import collections

Joe = {"Age": 28, "Race": "Latino", "Job": "Nurse"}
Bob = {"Age": 25, "Race": "White", "Job": "Mechanic", "Random": "stuff"}

#Just for clarity:
Joe = collections.OrderedDict(Joe)
Bob = collections.OrderedDict(Bob)

print Joe
# OrderedDict([('Age', 28), ('Race', 'Latino'), ('Job', 'Nurse')])
print Bob
# OrderedDict([('Age', 25), ('Race', 'White'), ('Job', 'Mechanic'), ('Random', 'stuff')])

이번에는 순서가 맞는데 다른 것들을 출력하면 안 되는 거죠? (목록에 넣고 함수 호출을 보여주는 것)

어디서 실수를 하는 거지?Python의 pi 버전은 Linux 버전이기 때문에 관련이 없을 것입니다.

먼저 사전을 만든 다음 사전을 다음으로 전달합니다.OrderedDictPython 버전 < 3.6의 경우, 그렇게 할 때쯤이면 더 이상 순서가 정확하지 않을 것입니다. dict본질적으로 순서가 없습니다.

대신 튜플 순서를 전달합니다.

ship = [("NAME", "Albatross"),
        ("HP", 50),
        ("BLASTERS", 13),
        ("THRUSTERS", 18),
        ("PRICE", 250)]
ship = collections.OrderedDict(ship)

인쇄할 때 표시되는 내용OrderedDict그것은 표현이고, 그것은 전적으로 옳습니다. OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])단지 재현 가능한 표현으로, 당신에게 그 내용이 무엇인지 보여줄 뿐입니다.OrderedDict.


(*)CPython 3.6 구현에서,dicttype은 삽입 순서를 보존하는 행복한 부작용을 가진 메모리 효율적인 내부 구조를 사용하도록 업데이트되었으며, 확장적으로 질문에 표시된 코드는 문제 없이 작동합니다.Python 3.7부터는 Python 언어 사양이 업데이트되어 모든 Python 구현이 이 동작을 따라야 합니다.자세한 내용과 여전히 사용하려는 이유에 대해서는 제 다른 답변을 참조하십시오.OrderedDict()어떤 경우에는

딕트가 정의된 코드의 이 부분을 편집할 수 없는 경우에도 다음과 같이 원하는 방식으로 언제든지 딕트를 주문할 수 있습니다.

from collections import OrderedDict

order_of_keys = ["key1", "key2", "key3", "key4", "key5"]
list_of_tuples = [(key, your_dict[key]) for key in order_of_keys]
your_dict = OrderedDict(list_of_tuples)

ASC 등과 같은 일반적인 주문이 아닌 사용자 지정 주문이 필요한 경우 대부분 OrderDict를 사용합니다.

제안된 솔루션은 다음과 같습니다.

import collections
ship = {"NAME": "Albatross",
         "HP":50,
         "BLASTERS":13,
         "THRUSTERS":18,
         "PRICE":250}

ship = collections.OrderedDict(ship)

print ship


new_dict = collections.OrderedDict()
new_dict["NAME"]=ship["NAME"]
new_dict["HP"]=ship["HP"]
new_dict["BLASTERS"]=ship["BLASTERS"]
new_dict["THRUSTERS"]=ship["THRUSTERS"]
new_dict["PRICE"]=ship["PRICE"]


print new_dict

다음과 같이 출력됩니다.

OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
OrderedDict([('NAME', 'Albatross'), ('HP', 50), ('BLASTERS', 13), ('THRUSTERS', 18), ('PRICE', 250)])

참고: 항목이 삭제될 때 정렬된 새 사전은 정렬 순서를 유지합니다.그러나 새 키가 추가되면 키가 끝에 추가되고 정렬이 유지되지 않습니다. (공식 문서)

이전 딕트에서 순서가 지정된 딕트를 한 줄로 만들 수 있습니다.

from collections import OrderedDict
ordered_dict = OrderedDict(sorted(ship.items())

키에 의한 에 새로운 정렬 키는ordered_dict오래된 딕트의 키로 정렬됩니다.

dict.items()를 사용합니다. 다음과 같이 간단합니다.

ship = collections.OrderedDict(ship.items())

이것이 대안이 되기를 바랍니다.건배!


import collections

ship = {"NAME": "Albatross",
         "HP":50,
         "BLASTERS":13,
         "THRUSTERS":18,
         "PRICE":250}

# unsequenced key value pair in the dict
print ship

# before using inherent dict for creating an OrderedDict
print collections.OrderedDict(ship)
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])

list_key = ["NAME","HP","BLASTERS","THRUSTERS","PRICE"]
ordered_list = [(key,ship[key]) for key in list_key]
ordered_ship = collections.OrderedDict(ordered_list)

print ordered_ship
# OrderedDict([('NAME', 'Albatross'), ('HP', 50), ('BLASTERS', 13), ('THRUSTERS', 18), ('PRICE', 250)])

언급URL : https://stackoverflow.com/questions/15711755/converting-dict-to-ordereddict

반응형