programing

사전에 하나의 키에 여러 값 추가

subpage 2023. 6. 8. 19:50
반응형

사전에 하나의 키에 여러 값 추가

저는 파이썬이 처음이고 연도와 연도별 가치 목록을 가지고 있습니다.내가 하고 싶은 것은 연도가 사전에 이미 있는지 확인하고 만약 있다면 특정 키에 대한 값 목록에 값을 추가하는 것입니다.

예를 들어, 저는 연도 목록을 가지고 있고 매년 하나의 값을 가집니다.

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

반응형