Python: Найдите идентичные объекты в нескольких списках

У меня есть список произвольного числа списков, например:

[[1,2,3], [3,4,5], [5,6,7], [7,8,9]]

Теперь я хотел бы список, содержащий все элементы, которые присутствуют больше чем в одном списке:

[3,5,7]

Как я сделал бы это?

Спасибо!

5
задан mathias 22 January 2010 в 09:36
поделиться

10 ответов

так же, как вы сделаете это вручную:

seen = set()
repeated = set()
for l in list_of_lists:
  for i in set(l):
    if i in seen:
      repeated.add(i)
    else:
      seen.add(i)

, кстати, вот один вкладыш (без подсчета импорта), которые искали некоторые люди (должны быть менее эффективными, чем другой подход)

from itertools import *
reduce(set.union, (starmap(set.intersection, combinations(map(set, ll), 2))))
12
ответ дан 18 December 2019 в 06:02
поделиться

Чистый способ, вероятно, будет использовать Увеличить:

def findCommon(L):
    def R(a, b, seen=set()):
        a.update(b & seen)
        seen.update(b)
        return a
    return reduce(R, map(set, L), set())

result = findCommon([[1,2,3], [3,4,5], [5,6,7], [7,8,9]])

Результат является набором, но просто сделать список (результат) , если вам действительно нужен список.

6
ответ дан 18 December 2019 в 06:02
поделиться

Ссылка: http://docs.cython.org/library/stdtypes.html#sset

#!/usr/bin/python

ll = [[1,2,3], [3,4,5], [5,6,7], [7,8,9]]
ls = [set(l) for l in ll]

su = ls[0]  #union
ssd = ls[0] #symmetric_difference
for s in ls[1:]:
  su = su.union(s)
  ssd = ssd.symmetric_difference(s)

result = su.difference(ssd)
print list(result)

=>

[3, 5, 7]

Пересмотреть и принять FP,

ll = [[1,2,3], [3,4,5], [5,6,7], [7,8,9]]

u = reduce(set.union, map(set, ll))
sd = reduce(set.symmetric_difference, map(set, ll))
print u - sd

=>

[3, 5, 7]
3
ответ дан 18 December 2019 в 06:02
поделиться
>>> sets = [[1,2,3], [3,4,5], [5,6,7], [7,8,9]]
>>> seen = set()
>>> duplicates = set()
>>> 
>>> for subset in map(set, sets) :
...     duplicates |= (subset & seen)
...     seen |= subset
... 
>>> print(duplicates)
set([3, 5, 7])
>>> 

Я попробовал на один рейтинг ответа с картой / уменьшением, но не могу полностью получить его.

1
ответ дан 18 December 2019 в 06:02
поделиться
-

Вы можете использовать словарь для получения подсчета каждого

from collections import defaultdict

init_list = [[1,2,3], [3,4,5], [5,6,7], [7,8,9]]
#defaultdict, every new key will have a int(0) as default value
d = defaultdict(int)
for values in init_list:
  #Transform each list in a set to avoid false positives like [[1,1],[2,2]]
  for v in set(values):
    d[v] += 1

#Get only the ones that are more than once
final_list = [ value for value,number in d.items() if number > 1 ]
1
ответ дан 18 December 2019 в 06:02
поделиться
l=[[1,2,3], [3,4,5], [5,6,7], [7,8,9]]
d={}
for x in l:
    for y in x:
        if not d.has_key(y):
            d[y]=0
        d[y]+=1
[x for x,y in d.iteritems() if y>1]
0
ответ дан 18 December 2019 в 06:02
поделиться

Вот мой ходи:

seen = set()
result = set()
for s in map(set, [[1,2,3], [3,4,5], [5,6,7], [7,8,9]]):
    result.update(s & seen)
    seen.update(s)
print result

Это отпечатки:

set([3, 5, 7])
0
ответ дан 18 December 2019 в 06:02
поделиться

Флаттен, сортировка, 1 для петли, сравнивающих номера до и после

-2
ответ дан 18 December 2019 в 06:02
поделиться

Попробуйте это:

data = [[1,2,3], [3,4,5], [5,6,7], [7,8,9], [1,2,3]]

res = set()

for i in data:
    for j in data:
        if i is not j:
            res |= set(i) & set(j)

print res
1
ответ дан 18 December 2019 в 06:02
поделиться

Можно использовать набор, см. http://docs.python.org/library/stdtypes.html#set

-1
ответ дан 18 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: