163

私はpythonが初めてで、年ごとの年と値のリストがあります。私がやりたいことは、年が辞書に既に存在するかどうかを確認し、存在する場合は、特定のキーの値のリストに値を追加することです。

たとえば、年のリストがあり、各年に 1 つの値があります。

2010  
2  
2009  
4  
1989  
8  
2009  
7  

私がやりたいことは、年をキーとして、それらの1桁の数字を値として辞書に入力することです。ただし、2009 が 2 回リストされている場合、その 2 番目の値をその辞書の値のリストに追加したいので、次のようにします。

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  
4

7 に答える 7

231

あなたの質問を言い換えることができれば、あなたが望むのは、年をキーとする辞書と、その年に関連付けられた値のリストを含む各年の配列ですよね? これが私がそれを行う方法です:

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]
}

一般に、"並列配列" を作成するプログラミング方法は適切ではありません。この場合、アイテムは、両方を包含するコンテナーの適切な子になるのではなく、同じインデックスを持つことによって暗黙的に相互に関連付けられます。

于 2010-07-07T22:00:52.907 に答える
117

collections.defaultdict(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]})

これにより、年に関連する数字を見たことがあるかどうかを心配する必要がなくなります。欠落しているキーは常にリストになることを知っているので、追加して忘れるだけです。キーがすでに存在する場合は、追加されるだけです。

于 2010-07-07T21:53:56.590 に答える
56

使用できますsetdefault

for line in list:  
    d.setdefault(year, []).append(value)

これが機能するのは、setdefault がリストを返し、それを辞書に設定するためです。また、リストは可変であるため、setdefault によって返されたバージョンに追加することは、辞書自体内のバージョンに追加することと同じです。それが理にかなっているなら。

于 2010-07-07T22:00:17.230 に答える
26
d = {} 

# import list of year,value pairs

for year,value in mylist:
    try:
        d[year].append(value)
    except KeyError:
        d[year] = [value]

Python のやり方 - 許可を求めるより許しを受ける方が簡単です!

于 2010-07-09T12:52:50.550 に答える
17

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)
于 2016-10-17T10:47:21.467 に答える
7

これらの値をタプルのリストに入れると簡単です。これを行うには、リストのスライスと zip 関数を使用できます。

data_in = [2010,2,2009,4,1989,8,2009,7]
data_pairs = zip(data_in[::2],data_in[1::2])

Zip は任意の数のリスト (この場合は の偶数エントリと奇数エントリ) を取り、それらを 1 つdata_inのタプルにまとめます。

これでメソッドを使用できますsetdefault

data_dict = {}
for x in data_pairs:
    data_dict.setdefault(x[0],[]).append(x[1])

setdefaultキーとデフォルト値を取り、関連付けられた値を返すか、現在の値がない場合はデフォルト値を返します。この場合、空のリストまたは入力済みのリストを取得し、それに現在の値を追加します。

于 2012-12-11T21:17:53.327 に答える