如何从for循环中获取多个值?

时间:2011-03-25 19:54:30

标签: python for-loop set unique-values

我有一个列的记录列表,列表被命名为日期。我试图从列表中获取不同的日期。该列表有许多重复日期,例如1/1 / 2010,1 / 1/2010,.......但也有不同的日期。 但如果我使用:

for date in dates: ....

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

for differentdate in dates:... 

语言是Python !!

4 个答案:

答案 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来适应其他数据结构。