사전에 하나의 키에 여러 값 추가
저는 파이썬이 처음이고 연도와 연도별 가치 목록을 가지고 있습니다.내가 하고 싶은 것은 연도가 사전에 이미 있는지 확인하고 만약 있다면 특정 키에 대한 값 목록에 값을 추가하는 것입니다.
예를 들어, 저는 연도 목록을 가지고 있고 매년 하나의 값을 가집니다.
2010
2
2009
4
1989
8
2009
7
제가 하고 싶은 것은 사전에 연도를 키로, 한 자리 숫자를 값으로 채우는 것입니다.그러나 2009년이 두 번 나열된 경우 두 번째 값을 해당 사전의 값 목록에 추가하고 싶으므로 다음을 수행합니다.
2010: 2
2009: 4, 7
1989: 8
현재 저는 다음을 보유하고 있습니다.
d = dict()
years = []
(get 2 column list of years and values)
for line in list:
year = line[0]
value = line[1]
for line in list:
if year in d.keys():
d[value].append(value)
else:
d[value] = value
d[year] = year
질문을 다시 말씀드리면, 당신이 원하는 것은 연도를 키로 하는 사전과 그 연도와 관련된 값 목록이 포함된 연도의 배열입니다. 그렇죠?다음과 같은 방법이 있습니다.
years_dict = dict()
for line in list:
if line[0] in years_dict:
# append the new number to the existing array at this slot
years_dict[line[0]].append(line[1])
else:
# create a new array in this slot
years_dict[line[0]] = [line[1]]
years_dict 내에 다음과 같이 나타나는 사전입니다.
{
"2010": [2],
"2009": [4,7],
"1989": [8]
}
일반적으로 "병렬 배열"을 만드는 것은 좋지 않은 프로그래밍 방법입니다. 여기서 항목들은 둘 다를 포함하는 컨테이너의 적절한 자식이 아니라 동일한 인덱스를 가짐으로써 서로 암시적으로 연관됩니다.
(Python 2.5에 추가)를 사용하는 것이 가장 좋습니다.이렇게 하면 누락된 키의 기본 개체 유형을 지정할 수 있습니다(예:list
).
따라서 키가 존재하지 않는 경우 키를 먼저 생성한 다음 키의 값에 추가하는 대신, 중간자를 잘라내고 존재하지 않는 키에 직접 추가하면 원하는 결과를 얻을 수 있습니다.
데이터를 사용한 간단한 예:
>>> from collections import defaultdict
>>> data = [(2010, 2), (2009, 4), (1989, 8), (2009, 7)]
>>> d = defaultdict(list)
>>> d
defaultdict(<type 'list'>, {})
>>> for year, month in data:
... d[year].append(month)
...
>>> d
defaultdict(<type 'list'>, {2009: [4, 7], 2010: [2], 1989: [8]})
이렇게 하면 연도와 관련된 숫자를 보았는지 여부에 대해 걱정할 필요가 없습니다.누락된 키가 항상 목록이 된다는 것을 알고 추가하고 잊어버리는 것입니다.키가 이미 있는 경우 키는 에 추가됩니다.
사용할 수 있습니다.setdefault
.
for line in list:
d.setdefault(year, []).append(value)
이것은 setdefault가 목록을 반환하고 사전에 설정하기 때문에 작동하며, 목록이 변경 가능하기 때문에 setdefault가 반환하는 버전에 추가하는 것은 사전 자체 내부의 버전에 추가하는 것과 같습니다.그게 말이 된다면요.
d = {}
# import list of year,value pairs
for year,value in mylist:
try:
d[year].append(value)
except KeyError:
d[year] = [value]
파이썬 방식 - 허락을 구하는 것보다 용서를 받는 것이 더 쉽습니다!
다음은 다음을 사용하여 이 작업을 수행하는 다른 방법입니다.not in
연자산:
# define an empty dict
years_dict = dict()
for line in list:
# here define what key is, for example,
key = line[0]
# check if key is already present in dict
if key not in years_dict:
years_dict[key] = []
# append some value
years_dict[key].append(some.value)
이러한 값을 튜플 목록으로 가져오는 것이 더 쉽습니다.이를 위해 목록 슬라이싱과 zip 기능을 사용할 수 있습니다.
data_in = [2010,2,2009,4,1989,8,2009,7]
data_pairs = zip(data_in[::2],data_in[1::2])
목록을 합니다. 이 Zip의 및 은 다음과 같습니다.data_in
그리고 그것들을 튜플로 묶습니다.
이제 사용할 수 있습니다.setdefault
방법.
data_dict = {}
for x in data_pairs:
data_dict.setdefault(x[0],[]).append(x[1])
setdefault
키와 기본값을 사용하고 연결된 값을 반환하거나 현재 값이 없는 경우 기본값을 반환합니다.이 경우 빈 목록이나 채워진 목록이 나타나고 현재 값을 추가합니다.
(거의) 하나의 라이너를 원하는 경우:
컬렉션에서 가져오기 데크 d = {}deque(((d.setdefault(year, []).연도에 대한 값, source_of_data의 값), maxlen=0)
용사를 합니다.dict.setdefault
"키가 이미 있는지 확인하고 없으면 새 목록을 만듭니다"라는 아이디어를 단일 호출로 캡슐화할 수 있습니다.이를 통해 다음에 의해 소비되는 생성자 식을 작성할 수 있습니다.deque
대기열 길이가 0으로 설정되어 있으므로 가능한 한 효율적입니다.데케는 즉시 폐기되고 결과는 다음과 같습니다.d
.
이건 그냥 재미로 한 일입니다.저는 그것을 사용하는 것을 추천하지 않습니다.데케를 통해 임의의 반복 가능한 것을 소비하는 시간과 장소가 있는데, 이것은 확실히 아닙니다.
언급URL : https://stackoverflow.com/questions/3199171/append-multiple-values-for-one-key-in-a-dictionary
'programing' 카테고리의 다른 글
새 서버의 테스트 코드 java.time.localdatetime을 날짜로 변환할 수 없습니다.생산 과정에서 발생하지 않습니다. (0) | 2023.06.08 |
---|---|
OWIN Startup.cs 클래스를 사용하고 모든 구성을 해당 클래스로 이동하는 경우 Global.asax.cs 파일이 필요합니까? (0) | 2023.06.08 |
DataGrip: Oracle에 SYSDBA로 연결하는 방법 (0) | 2023.06.08 |
R에서 언어 설정을 변경하는 방법 (0) | 2023.06.08 |
Laravel 마이그레이션을 통해 mysql/mariaDB 함수를 사용할 수 없습니다. (0) | 2023.06.08 |