3

次のようなPythonのリストがあります。

[
['name1',value2],
['name2',value3],
['name3',value4],
['name4',value4],
['name5',value5],
['name6',value2],
['name7',value2],
['name8',value4]
]

「値」フィールドから 2 つ以上の重複があるリスト内のリストを削除したいと考えています。結果のリストは次のようになります。

[
['name1',value2],
['name2',value3],
['name3',value4],
['name4',value4],
['name5',value5],
['name6',value2]
]

編集:

これが問題になるとは思わなかったので、明確な質問のために単純にしましたが、実際には各内部リストに2つではなく4つの値があります。いいえ:

[
['name1',value2,'something','else'],
['name2',value3,'something','else'],
['name3',value4,'something','else'],
['name4',value4,'something','else'],
['name5',value5,'something','else'],
['name6',value2,'something','else']
]

Ashwini Chaudhary の答えは完全に機能しますが、4 つすべてではなく、最初の 2 つの要素のみを返します...完全な詳細を追加しなかった私のせいです。学んだ教訓!

4

3 に答える 3

2

このコードはトリックを行います:

from collections import defaultdict
def dup2(sequence):
    seen = defaultdict(int)
    for key, value in sequence:
        if seen[value] < 2:
            seen[value] += 1
            yield [key, value]

dup2はジェネレーターなので、結果を反復処理するときにリストを処理します。

for key, value in dup2(seq):
    # ... your code here

結果をプレーンなリストとして取得するには、list関数を使用します:

list(dup2(seq))
于 2012-10-23T13:53:55.873 に答える
1

順序が重要でない場合:

In [14]: lis=[
['name1','value2','something','else'],
['name2','value3','something','else'],
['name3','value4','something','else'],
['name4','value4','something','else'],
['name5','value5','something','else'],
['name6','value2','something','else']
]

In [22]: dic={}

In [23]: for x in lis:
    dic.setdefault(x[1],[]).append([x[0]]+x[2:])
   ....:     
   ....:     

In [25]: dic
Out[25]: 
{'value2': [['name1', 'something', 'else'], ['name6', 'something', 'else']],
 'value3': [['name2', 'something', 'else']],
 'value4': [['name3', 'something', 'else'], ['name4', 'something', 'else']],
 'value5': [['name5', 'something', 'else']]}

In [27]: [[y[0]]+[x]+y[1:] for x in dic for y in dic[x][:2]]
Out[27]: 
[['name5', 'value5', 'something', 'else'],
 ['name3', 'value4', 'something', 'else'],
 ['name4', 'value4', 'something', 'else'],
 ['name2', 'value3', 'something', 'else'],
 ['name1', 'value2', 'something', 'else'],
 ['name6', 'value2', 'something', 'else']]
于 2012-10-23T14:21:37.667 に答える
0
from collections import defaultdict

list1 = [['name1','value2'],
         ['name2','value3'],
         ['name3','value4'],
         ['name4','value4'],
         ['name5','value5'],
         ['name6','value2'],
         ['name7','value2'],
         ['name8','value4']]

list2 = [['name1','value2'],
         ['name2','value3'],
         ['name3','value4'],
         ['name4','value4'],
         ['name5','value5'],
         ['name6','value2']]

d = defaultdict(list)
for name, value in list1:
    d[value].append(name)

list3 = [[name, value] for value, names in d.items() for name in names[:2]]

print(sorted(list3) == sorted(list2))  # True

誰かが順序を維持し、イテレータとして機能するより良い解決策を考え出すと確信しています。

于 2012-10-23T13:56:30.713 に答える