1

開始する次のリストがある場合:

list1 = [(12, "AB"), (12, "AB"), (12, "CD"), (13, Null), (13, "DE"), (13, "DE")]

私はそれを次のリストに変えたい:

list2 = [(12, "AB", "CD"), (13, "DE", Null)]

基本的に、関連付けられたキーを持つ 1 つ以上のテキスト値がある場合、2 番目のリストには最初にキー値があり、次に 1 つがテキスト値、次にもう 1 つになります。2 番目の文字列値がない場合、2 番目のリストが Null の場合、項目の 3 番目の値。

私は頭の中でこれを何度も繰り返しましたが、それを行う方法がわかりません。set() を使用すると、正確な重複が削減されますが、キー値が同じである場合、2 番目の値を比較するために何らかの前/次の操作が必要になります。

辞書を使用しない理由は、キー値の順序を同じにする必要があるためです (12、13 など)。

4

3 に答える 3

3

簡単な方法では、複数回ループしてlist1、毎回関連する値を取得します。すべてのキーを取得するのは初めてです。次に、キーごとにすべての値を取得します ( repl.it ):

Null = None
list1 = [(12, "AB"), (12, "AB"), (12, "CD"), (13, Null), (13, "DE"), (13, "DE")]

keys = []
for k,v in list1:
    if k not in keys:
        keys.append(k)
list2 = []
for k in keys:
    values = []
    for k2, v in list1:
        if k2 == k:
            if v not in values:
                values.append(v)
    list2.append([k] + values)

print(list2)

パフォーマンスを向上させたい場合は、list1複数回トラバースする必要がないように辞書を中間として使用します ( repl.it ):

from collections import defaultdict 
Null = None
list1 = [(12, "AB"), (12, "AB"), (12, "CD"), (13, Null), (13, "DE"), (13, "DE")]

keys = []
for k,v in list1:
    if k not in keys:
        keys.append(k)

intermediate = defaultdict(list)
for k, v  in list1:
    if v not in intermediate[k]:
        intermediate[k].append(v)

list2 = []
for k in keys:
    list2.append([k] + intermediate[k])

print(list2)
于 2013-07-05T00:42:16.330 に答える
1

私が見ることができる最も簡単な方法は次のとおりです。

>>> from collections import OrderedDict

>>> d = OrderedDict()
>>> for (k, v) in [(12, "AB"), (12, "AB"), (12, "CD"), (13, None), (13, "DE"), (13, "DE")]:
...     if k not in d: d[k] = set()
...     d[k].add(v)

>>> d
OrderedDict([(12, {'AB', 'CD'}), (13, {'DE', None})])

または、リストが必要で (値の順序も保持されます)、少し効率が悪くても構わない場合 (v not in ...テストでリストをスキャンする必要があるため):

>>> d = OrderedDict()
>>> for (k, v) in [(12, "AB"), (12, "AB"), (12, "CD"), (13, None), (13, "DE"), (13, "DE")]:
...     if k not in d: d[k] = []
...     if v not in d[k]: d[k].append(v)

>>> d
OrderedDict([(12, ['AB', 'CD']), (13, [None, 'DE'])])

そして最後に、次のようにしてリストに戻すことができます:

>>> list(d.items())
[(12, ['AB', 'CD']), (13, [None, 'DE'])]
>>> [[k] + d[k] for k in d]
[[12, 'AB', 'CD'], [13, None, 'DE']]
>>> [(k,) + tuple(d[k]) for k in d]
[(12, 'AB', 'CD'), (13, None, 'DE')]

あなたが望むフォーマットに正確に依存します。

[申し訳ありませんが、以前のコメントと返信は質問を誤解していました。]

于 2013-07-05T00:38:06.783 に答える
0
from collections import defaultdict

pairs = [(12, "AB"), (12, "AB"), (12, "CD"),
         (13, None), (13, "DE"), (13, "DE")]

result = defaultdict(set)
for k,v in pairs:
    result[k].add(v)

result = [(k,) + tuple(reversed(sorted(vs))) for k,vs in result.iteritems()]
于 2013-07-05T05:04:14.317 に答える