2

好的,另一个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”。

谢谢

4

5 回答 5

4
from functools import reduce # if Python 3

reduce(lambda x, y: x.intersection(y), (set(x.split(',')) for x in aDict.values()))
于 2011-10-14T09:29:13.067 回答
3

首先,您需要将这些转换为真实列表。

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

然后你可以使用集合来做交集。

result = set(l1) & set(l2) & set(l3)
于 2011-10-14T09:28:47.860 回答
1

PythonSet非常适合该任务。考虑以下(代码):

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
于 2011-10-14T09:29:36.920 回答
0

由于set.intersection()接受任意数量的集合,您可以不使用任何方法reduce()

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

请注意,此版本不适用于空的aDict.

如果您使用的是 Python 3,并且您的字典值是bytes对象而不是字符串,则只需拆分 atb","而不是",".

于 2011-10-14T12:01:22.610 回答
0
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
于 2011-10-14T09:32:49.397 回答