元のリストの重複を削除せずに、2つのリストを組み合わせて重複を削除する


115

2つ目のリストを結合する必要がある2つのリストがあります。2つ目のリストには、最初のリストの重複が無視されています。..少し説明するのが難しいので、コードがどのように見えるか、そして結果として私が何を望んでいるかの例を示します。

first_list = [1, 2, 2, 5]

second_list = [2, 5, 7, 9]

# The result of combining the two lists should result in this list:
resulting_list = [1, 2, 2, 5, 7, 9]

結果には、2つの「2」値を含む最初のリストがありますが、second_listにも2と5の値があるという事実は、最初のリストに追加されていません。

通常、このようなものにはセットを使用しますが、first_listのセットはすでに持っている重複値を削除します。だから私は単にこの望ましい組み合わせを達成するための最善/最速の方法を考えているだけです。

ありがとう。


3
2が3つある場合はどうなりsecond_listますか?
balpha 2009

@balpha:ええ、私はまだそれをどのように処理したいのか完全には決めていません。それは私が考えていたものですが、問題についての私の決断を
考えると省略さ

回答:


168

最初のリストに、最初のリストにない2番目のリストの要素を追加する必要があります。セットは、次のように、どの要素であるかを判別する最も簡単な方法です。

first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

in_first = set(first_list)
in_second = set(second_list)

in_second_but_not_in_first = in_second - in_first

result = first_list + list(in_second_but_not_in_first)
print(result)  # Prints [1, 2, 2, 5, 9, 7]

または、ワンライナーをご希望の場合は8-)

print(first_list + list(set(second_list) - set(first_list)))

2
または、これをソートする必要がある場合:print first_list + Sorted(set(second_list)-set(first_list))
hughdbrown

2
List(set(first_list)| set(second_list))#| ある集合交差点参照くださいstackoverflow.com/questions/4674013/...
staticd

1
@staticd:はい、しかしそれは間違った答えを与えます。2結果は2つあるはずですが、1つしかありません。
RichieHindle 2013

おっとっと。あなたが正しい。最初のリスト重複許可れていたことを完全に逃した。:P
staticd 2013年

66
resulting_list = list(first_list)
resulting_list.extend(x for x in second_list if x not in resulting_list)

7
最後に、セットへのキャストを含まない答え!称賛。
SuperFamousGuy 2013年

4
これは実際にはO(n * m)ですが、ハッシュ化できないもののリストがあり、パフォーマンスが問題ではない場合に便利です
alcuadrado

1
最初からも2番目からも複製したくないものは何ですか?
Dejell 2013

この手法では、リスト内の属性の順序が保持されますが、これはには当てはまりませんset。👍
はSubhash Bhushanの

29

セットを使用できます。

first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

resultList= list(set(first_list) | set(second_list))

print(resultList)
# Results in : resultList = [1,2,5,7,9]

はい、ありがとうございます。これは正常に動作します。resultList = first_list + list(set(second_list)-set(first_list))
Kathiravan Umaidurai

9

numpyを使用する場合は、これを1行のコードに減らすことができます。

a = [1,2,3,4,5,6,7]
b = [2,4,7,8,9,10,11,12]

sorted(np.unique(a+b))

>>> [1,2,3,4,5,6,7,8,9,10,11,12]


5
resulting_list = first_list + [i for i in second_list if i not in first_list]

1
setify first_list and you're "set"
u0b34a0f6ae

結果のリストはソートされません。
avakar 2009

1
どのリストにも重複をまったく望まない場合はどうなりますか?このようにして、1つのリストに重複がある場合、それらは返されます
Dejell

5

私にとって最も簡単です:

first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

merged_list = list(set(first_list+second_list))
print(merged_list)

#prints [1, 2, 5, 7, 9]

1
これは素晴らしい解決策ですが、辞書の配列をセットにしようとすると機能しないことに注意してください(例:を上げるTypeError: unhashable type: 'dict'
Lakesare

2

次のように、RichieHindleの応答とNed Batchelderの応答を組み合わせて、順序を維持する平均ケースの O(m + n)アルゴリズムを作成することもできます。

first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

fs = set(first_list)
resulting_list = first_list + [x for x in second_list if x not in fs]

assert(resulting_list == [1, 2, 2, 5, 7, 9])

音符x in sの最悪の場合の複雑有するO(m)をので、最悪の場合のこのコードの複雑さは依然としてO(M * N)


0

これは役立つかもしれません

def union(a,b):
    for e in b:
        if e not in a:
            a.append(e)

union関数は、2番目のリストを最初のリストにマージします。aの要素が既にaにある場合は、複製しません。ユニオン演算子の設定に似ています。この関数は変更されません。a = [1,2,3] b = [2,3,4]の場合。union(a、b)がa = [1,2,3,4]およびb = [2,3,4]を作成した後



-2
    first_list = [1, 2, 2, 5]
    second_list = [2, 5, 7, 9]

    newList=[]
    for i in first_list:
        newList.append(i)
    for z in second_list:
        if z not in newList:
            newList.append(z)
    newList.sort()
    print newList

[1、2、2、5、7、9]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.