Python пересечение элементов dict - PullRequest
2 голосов
/ 14 октября 2011

ОК, еще один вопрос по Python ...

У меня есть дикт:

aDict[1] = '3,4,5,6,7,8'
aDict[5] = '5,6,7,8,9,10,11,12'
aDict[n] = '5,6,77,88'

n может быть любым пределом, но ключи не в последовательности.

Какмне извлечь пересечение csv'd предметов?Таким образом, в этом случае ответ будет «5,6».

Спасибо

Ответы [ 5 ]

4 голосов
/ 14 октября 2011
from functools import reduce # if Python 3

reduce(lambda x, y: x.intersection(y), (set(x.split(',')) for x in aDict.values()))
3 голосов
/ 14 октября 2011

Прежде всего, вам необходимо преобразовать их в реальные списки.

l1 = '3,4,5,6,7,8'.split(',')

Затем вы можете использовать множества для пересечения.

result = set(l1) & set(l2) & set(l3)
1 голос
/ 14 октября 2011

Python Set s идеально подходят для этой задачи. Рассмотрим следующий ( псевдо код):

intersections = None
for value in aDict.values():
    temp = set([int(num) for num in value.split(",")])
    if intersections is None:
        intersections = temp
    else:
        intersections = intersections.intersection(temp)

print intersections
0 голосов
/ 14 октября 2011

Поскольку set.intersection() принимает любое количество наборов, вы можете обойтись без использования reduce():

set.intersection(*(set(v.split(",")) for v in aDict.values()))

Обратите внимание, что эта версия не будет работать для пустых aDict.

Если вы используете Python 3, а значения словаря - это bytes объекты, а не строки, просто разбейте на b"," вместо ",".

0 голосов
/ 14 октября 2011
result = None
for csv_list in aDict.values():
    aList = csv_list.split(',')
    if result is None:
        result = set(aList)
    else:
        result = result & set(aList)
print result
...