我有一个列的记录列表,列表被命名为日期。我试图从列表中获取不同的日期。该列表有许多重复日期,例如1/1 / 2010,1 / 1/2010,.......但也有不同的日期。 但如果我使用:
for date in dates: ....
它为每个日期重复循环(无论它是否相同),而不是不同的日期。我怎么能告诉它:
for differentdate in dates:...
语言是Python !!
答案 0 :(得分:5)
for date in set(dates):
set()
从另一个集合中的独特元素中创建一个集合。注意:这可能不会保留原始列表的顺序,因此如果您需要保留该订单,请使用@ GregHewgill的答案。
答案 1 :(得分:5)
您可以使用itertools模块按日期分组。例如:
>>> import itertools
>>> a = ["aaa", "bbb", "bbb", "ccc"]
>>> for k, g in itertools.groupby(a):
... print(k)
...
aaa
bbb
ccc
这保留了a
中元素的原始顺序(这对您来说很重要)。在循环内部,g
是一个生成器,它生成一个包含该键的每个元素的序列。有关详细信息,请参阅itertools.groupby
的文档。
答案 2 :(得分:0)
以下任一项:
def uniqueItems(seq, key=None, reverse=False):
"Returns a list of unique items in (customizable) order"
seq = list(set(seq))
seq.sort(key=key, reverse=reverse)
def uniqueItems(seq):
"Generator - return unique items in original order of first occurrence"
seen = set()
for item in seq:
if item not in seq:
yield item
seen.add(item)
可以用作
for date in uniqueItems(dates):
# do something with date
pass
答案 3 :(得分:0)
如果保留订单 很重要,那么Alex Martelli关于Remove duplicates from a sequence ActiveState配方的注释所产生的以下生成器函数将起作用(并且也应该相对快速地基于这些{{ 3}}其中包括原始的基于字典的非生成器Martelli样本:
dates = ["1/1/2010", "1/3/2010", "1/3/2010", "1/7/2010"]
def unique(seq, idfun=lambda x: x):
seen = set()
for item in seq:
marker = idfun(item)
if marker not in seen:
seen.add(marker)
yield item
for date in unique(dates):
print date
# 1/1/2010
# 1/3/2010
# 1/7/2010
另一个不错的功能是,它非常灵活,可以通过提供用于检索要比较的数据的自定义idfun
来适应其他数据结构。