比较列表

时间:2011-09-09 18:28:58

标签: python list

我有8个列表(jan,feb,mar,apr,may,jun,jul,aug),每个列表都包含列表格式的名称,即

['John Smith', 'Cat Stevens', 'Andrew Alexander', 'El Gordo Baba', 'Louis le Roy']

如何按顺序比较这些列表,看看名称何时出现(即订阅)以及名称何时消失(即取消订阅)。

所以,约翰史密斯说,直到二月才出现,我希望得到这些信息。让我们说他在7月取消订阅,我也想要这些信息(这比前者更重要。)

5 个答案:

答案 0 :(得分:6)

请勿使用列表,而是使用set

您可以使用设置差异找到janfeb之间的(un)订阅:

subs = feb - jan
unsubs = jan - feb

话虽如此,按照Daenyth的建议你会更好。将这些放在数据库中,添加joinedleft日期字段,您将获得比几个月更精细的粒度,您不需要存储重复数据。

答案 1 :(得分:1)

data = {
 'jan': ['John Smith', 'Cat Stevens', 'Andrew Alexander', 'El Gordo Baba'],
 'feb': ['Louis le Roy', 'John Smith'],
 'mar': ['Cat Stevens', 'Louis le Roy']
}

from itertools import izip

keys = 'jan feb mar'.split()
for m1,m2 in izip(keys,keys[1:]):
    a = set(data[m1])
    b = set(data[m2])
    print m1, '\n\tsubscribed:', ','.join(b-a), '\n\tquit:', ','.join(a - b )

结果:

jan 
    subscribed: Louis le Roy 
    quit: Andrew Alexander,Cat Stevens,El Gordo Baba
feb 
    subscribed: Cat Stevens 
    quit: John Smith

答案 2 :(得分:0)

data = {
 'jan': ['John Smith', 'Cat Stevens', 'Andrew Alexander', 'El Gordo Baba'],
 'feb': ['Louis le Roy', 'John Smith'],
 'mar': ['Cat Stevens', 'Louis le Roy']
}

subs = {}
unsubs = {}
for mon in data:
    for name in data[mon]:
        if name not in subs:
            subs[name] = mon
        else:
            unsubs[name] = mon
>>> subs
{'Andrew Alexander': 'jan', 'Louis le Roy': 'mar', 'John Smith': 'jan', 'El Gordo Baba': 'jan', 'Cat Stevens': 'jan'}
>>> unsubs
{'Louis le Roy': 'feb', 'John Smith': 'feb', 'Cat Stevens': 'mar'}

答案 3 :(得分:0)

作为首发者:

from collections import defaultdict
dd = dict(jan=(0,jan), feb=(1, feb), ...)

appearances = defaultdict(list)

for k, (i, li) in dd.items():
   for name in li:
       appearances[name].append((i,k))

for name in appearances.keys():
    months = [ (name, i) for i, name in sorted(appearances[name]) ]
    print name, months

您可以为每个名称获取此名称显示的对(month, index)对的列表。 index是月份的索引。现在,您可以检查间隙,最小索引和最大索引。

答案 4 :(得分:0)

这是一个简单的例子:

jan,feb,mar,apr,may,jun,jul,aug = [1],[1,2],[1,2,3],[1,2,3,4],[2,3,4],[3,4],[4],[]
months = [set(m) for m in [jan,feb,mar,apr,may,jun,jul,aug]]
changes = [(list(b-a), list(a-b)) for a, b in zip(months, months[1:])]

>>> changes
[([2], []), ([3], []), ([4], []), ([], [1]), ([], [2]), ([], [3]), ([], [4])]

changes中的每个元素都是从一个月到下一个月的转换,其中元组中的第一个项是所有已添加项的列表,而元组中的第二个项是所有这些项的列表。左