1

我有一个列中的记录列表,该列表被命名为日期。我正在尝试从列表中删除不同的日期。该列表有许多重复的日期,例如 2010 年 1 月 1 日、2010 年 1 月 1 日、……。但也有不同的日期。但如果我使用:

for date in dates: ....

它为每个日期重复循环(无论它是否相同),而不是不同的日期。我怎么能告诉它这样做:

for differentdate in dates:... 

语言是Python!!

4

4 回答 4

5
for date in set(dates):

set()用另一个集合中的独特元素制作一个集合。注意:这可能不会保留原始列表的顺序,因此如果您需要保留该顺序,请使用@GregHewgill 的回答。

于 2011-03-25T19:57:27.157 回答
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有关更多信息,请参阅文档。

于 2011-03-25T20:00:23.040 回答
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
于 2011-03-25T20:54:00.783 回答
0

如果保留顺序很重要,则从 Alex Martelli 关于从序列 ActiveState 配方中删除重复项的评论中派生的以下生成器函数将起作用(并且基于这些基准(包括原始的基于字典的、非-生成器 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另一个不错的功能是它相当灵活,并且可以通过提供自定义用于检索要比较的数据来适应其他数据结构。

于 2011-03-25T21:39:19.020 回答