2016-02-10 13 views
13

varsayalım ben şöyle tamsayılar birkaç listeleri vardır: Bu yere gerçekleşen tüm unsurların tek bir liste oluşturmak için en verimli/en pythonic yolu nedirbazı meydana unsurları bulun ama hepsi değil listeleri

[0,3,4] 
[2,3,4,7] 
[2,3,4,6] 

en az bir liste, ancak tüm listelerde bulunmuyor mu? Bu durumda

[0,2,7,6] 
+1

aynı listede unsurları tekrar ettiler mi? – SirParselot

+1

Sipariş önemli mi? –

+0

n listeniz varsa (ve tekrarlama olmadığını varsayarak), tüm listelerde 1 ile n-1 arasında gerçekleşen sayıların doğru olmasını ister misiniz? –

cevap

6

"O zaman giriş listelerinin sayısı kadar defalarca ortaya kalmamasıdır elemanlarını seçebilir "for" listeleri için ". StephenTG'nin yayınladığı gibi, sendika ile tüm listelerin kesişimi arasındaki farkı kolayca elde edin.

Counter üzerinden kümeler kullanmanın avantajı, her listede yalnızca bir kez görünen değerler hakkında varsayım yapmanıza gerek olmamasıdır. bakılmaksızın, kaç listeleri arasında

aşağıdaki çalışır:

> list_of_sets = [set(l) for l in lists] 
> set.union(*list_of_sets) - set.intersection(*list_of_sets) 
{0, 2, 6, 7} 
4

Bir set olarak tüm listelerin kavşak ve set olarak tüm listelerin birliğini almak ve kavşak olmayan birliğe tüm unsurları ele geçirebilir olurdu . en kdopen cevap gösterdiği gibi, here

>>> union_set = set(l1).union(l2,l3) 
>>> intersection_set = set(l1).intersection(l2,l3) 
>>> union_set - intersection_set 
set([0, 2, 6, 7]) 

belgelenmiş Veya bu işlemek için union, intersection ve difference yöntemleri 'Eğer listelerinin tam sayısını bilmiyorum eğer setleri listesi oluşturabilir vardır

+2

Ya kaç tane l1, l2, l3, ... olduğunu bilmiyorsanız ne olabilir? Örneğin bir liste listesine birliği uygulayabilir misiniz? –

+0

Bu yüzden ayrı bir cevap yayınladım – kdopen

+1

Daha genel olarak yazıldığı için kdopen'i seçtim, ama bunun için teşekkürler –

4

ile başa çıkacağız Her bir listenin bir defada bir öğe içerdiğini varsayarsak, her bir elemanın tekrar sayısını saymak için bir sayaç kullanabilirsiniz.

from itertools import chain 
from collections import Counter 

lists = [ 
    [0, 3, 4], 
    [2, 3, 4, 7], 
    [2, 3, 4, 6] 
] 

print [x for x, c in Counter(chain(*lists)).items() if c != len(lists)] 

Sonuç:

sen yerine eğer cevap .. sorunuzu ima
[0, 2, 6, 7] 
+0

Bu tam olarak ne yazıyordum +1 – SirParselot

+0

Bu harika ama seçilen cevap için generality ile gittim. –

+0

Bu yalnızca iç listelerde tekrarlanan elemanlar yoksa –

İlgili konular