我有8个列表(jan,feb,mar,apr,may,jun,jul,aug),每个列表都包含列表格式的名称,即
['John Smith', 'Cat Stevens', 'Andrew Alexander', 'El Gordo Baba', 'Louis le Roy']
等
如何按顺序比较这些列表,看看名称何时出现(即订阅)以及名称何时消失(即取消订阅)。
所以,约翰史密斯说,直到二月才出现,我希望得到这些信息。让我们说他在7月取消订阅,我也想要这些信息(这比前者更重要。)
答案 0 :(得分:6)
请勿使用列表,而是使用set
。
您可以使用设置差异找到jan
和feb
之间的(un)订阅:
subs = feb - jan
unsubs = jan - feb
话虽如此,按照Daenyth的建议你会更好。将这些放在数据库中,添加joined
和left
日期字段,您将获得比几个月更精细的粒度,您不需要存储重复数据。
答案 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
中的每个元素都是从一个月到下一个月的转换,其中元组中的第一个项是所有已添加项的列表,而元组中的第二个项是所有这些项的列表。左