2

やあ!私はリストのリストを持っています、そしてサブリストの最初の要素が等しいとき、私はそれらの2番目の要素を追加して結果を印刷する必要があります。私は長い間それについて考えてきました、しかし私はこれがどのように行われることができるか理解できないようです。これが私の問題の例です:

num_list = [[1, 2], [3, 4], [1, 2], [3, 4], [3, 4]]

# 0th and 2nd sublists both have 1 as their first element.
# sum = 2 + 2. print out 4.

# all the remaining sublists have 3 as their first element.
# sum = 4 + 4 + 4. print out 12. 

どうもありがとうございます!

PS:この種のマッピングは辞書を使用した方がよいことは承知していますが、これは私の問題を単純化したものにすぎません。私の実際のプログラムには2つ以上の値を持つサブリストがあり、等しくなければならない1つ以上の値を比較する必要があります。

4

4 に答える 4

1

このタスクには引き続き辞書を使用できます。タプルをキーとして使用します。

>>> d = {(1,1): (2,2), (3,3): (4,4)}
>>> d
{(1, 1): (2, 2), (3, 3): (4, 4)}
>>> d[(1,1)]
(2, 2)

Counterクラスについても学びたいと思うかもしれません。要素がより複雑な場合は、それらをオブジェクトでラップし、それらを__add__一緒に追加する方法をカスタマイズするメソッドを実装することをお勧めします。

from collections import Counter
c = Counter()
c[(1,1)] = 10
c[(2,2)] = 10
c[(1,1)] += 1

c2 = Counter()
c2[(2,2)] = 4
c2[(2,3)] = 5

これにより、次のことが得られます。

>>> c 
Counter({(1, 1): 11, (2, 2): 10})
>>> c + c2
Counter({(2, 2): 14, (1, 1): 11, (2, 3): 5})

リストは変更可能でハッシュできないため、リストをキーとして使用できないことに注意してください。タプルを使用する必要があります。

于 2013-01-02T17:34:12.700 に答える
0

標準の使用dict():

num_list = [[1, 2], [3, 4], [1, 2], [3, 4], [3, 4]]

d = dict()
for e in num_list:
    #get() checks if key exists, if not - returns 0        
    d[e[0]] = d.get(e[0], 0) + e[1]

print(d)

それは印刷します:

{1: 4, 3: 12}
于 2013-01-02T20:27:26.917 に答える
0

問題を十分に正確に説明していないようです。
あなたの本当の問題は、質問と@Blenderからの回答の両方に対するコメントからのみ把握できます。問題に対する彼の素晴らしい解決策は、私が理解しているのはあなたの問題ケースであるとすぐには機能しませんが、ほとんどです。

ニーズに合わせて拡張する方法は次のとおりです。

# some toy example data - I understand you want the first 2 sub_list
# to be "merged" because BOTH strings in pos 0 and 2 match
data = [['42x120x1800', 50, '50x90x800', 60],
        ['42x120x1800', 8, '50x90x800', 10],
        ['2x10x800', 5, '5x9x80', 6]]


from collections import defaultdict

# I'm using a lambda to initialize the items of the dict
# to a two-element list of zeros
d = defaultdict(lambda :[0, 0])
for sub_list in data:
    key = (sub_list[0], sub_list[2])
    d[key][0] += sub_list[1]
    d[key][1] += sub_list[3]

for key in d:
    print key, d[key]   
# ('2x10x800', '5x9x80') [5, 6]
# ('42x120x1800', '50x90x800') [58, 70]

その後、データの最初の表現に戻りたい場合:

new_data = [[key[0], val[0], key[1], val[1]] for key, val in d.iteritems()]
# [['2x10x800', 5, '5x9x80', 6], ['42x120x1800', 58, '50x90x800', 70]]
于 2013-01-02T22:18:41.630 に答える