迭代包含重复元素的列表

2024-09-28 18:15:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图迭代一个包含一些重复元素的列表。我使用的是重复的数量,所以在遍历列表之前,我不想将列表放入一个集合中。在

我试图计算元素出现的次数,然后写下元素(名称)和它出现的次数。在

我遇到的问题是,在我的输出CSV文件中,行数与元素出现的次数一样多。我将CSV写入一个HTML表后,它完成,所以我希望它是重复消除。在

我的最终目标是让它计算名称出现的次数,然后将一行写入包含名称和计数的CSV文件,然后移动到列表中的下一个名称。在

我尝试了搜索,发现了itertools.groupby,但我不确定这在这个例子中是否有用,如果有用,如何正确使用它。在

谢谢你的帮助。在

编辑:我忘了提Python2.6

with open(sys.argv[1]) as infile:
    rdr = csv.DictReader(infile, dialect='excel')
    qualsin = []
    headers = ['Qualifier Name','Appointments']
    for row in rdr:
        row['Qualifier Name'] = row['Qualifier Name'].upper()
        qualsin.append(row['Qualifier Name'])
    qualsin.sort()
    #total = 0
    with open('tempwork.csv', 'w') as tempwork:
        wrtr = csv.writer(tempwork, dialect='excel')
        wrtr.writerow(headers)
        for quals in qualsin:
            d = [quals, qualsin.count(quals)]
            #a = dict((key, value) for (key, value) in d)
            #total += qualsin.count(quals)
            wrtr.writerow(d)

Tags: csvnamein名称元素列表for次数
1条回答
网友
1楼 · 发布于 2024-09-28 18:15:16

你可以在一组另一个名字,然后使用原来的列表做计数。在

例如,给定qualsin = [0, 2, 3, 2, 3, 1, 2, 3, 5, 3, 3, 2, 4]

set_quals = set(qualsin) # This is set([0, 1, 2, 3, 4, 5])
for quals in set_quals: # Iterate over the values in the set, not the list
    d = [quals, qualsin.count(quals) # count the values from the list, not the set
    wrtr.writerow(d)

或者。。。在

^{pr2}$

编辑
由于更新了使用Python2.6,Counter不可用。然而,第一个解决方案仍然有效。在

你可以自己做一个计数器,只需:

counts = collections.defaultdict(int) # Available since 2.5
for quals in qualsin:
    counts[quals] += 1

如果我没弄错的话,使用计数器(无论是在2.7中还是在上面自制的)将把时间复杂度降低一倍。list.count是O(N),你在一个循环中这样做,得到O(N^2)。创建计数器的单个迭代只需O(N),因此对于较大的列表,这可能是一个很大的帮助。在

编辑2

要获得按字母顺序排序的输出,只需将重复数据消除列表(set)转换回已排序的列表。在

ordered_deduped_quals = sorted(set(qualsin))
for quals in ordered_deduped_quals:
    ...

相关问题 更多 >