我正在尝试迭代包含一些重复元素的列表。我正在使用重复数量,所以我不希望在迭代列表之前将列表放在一个集合中。
我试图计算元素出现的次数,然后写出元素(名称)和它出现次数的计数。
我遇到的问题是,在我的输出CSV文件中,行数和元素出现的次数一样多。我在完成后将CSV写入HTML表格,因此我希望对其进行重复数据删除。
我的最终目标是计算名称出现的次数,然后在包含名称和计数的CSV文件中写一行,然后移到列表中的下一个名称。
我尝试搜索并遇到itertools.groupby
,但我不确定这在这个实例中是否有用,如果是,请如何正确使用它。
感谢您的帮助。
编辑:我忘记提及 - Python 2.6with 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)
答案 0 :(得分:2)
您可以使用一组另一个名称进行删除,然后使用原始列表进行计数。
例如,给定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)
或者...
import collections
...
set_quals = set(qualsin) # This is set([0, 1, 2, 3, 4, 5])
counts = collections.Counter(qualsin) # This is Counter({3: 5, 2: 4, 0: 1, 1: 1, 4: 1, 5: 1}) which acts like a dictionary
for quals in set_quals:
d = [quals, counts[quals]] # use the name from the set and the value from the Counter
wrtr.writerow(d)
修改强>
由于您使用Python2.6的更新,计数器不可用。但是,第一个解决方案仍然有效。
你可以通过以下方式自己制作一个计数器:
counts = collections.defaultdict(int) # Available since 2.5
for quals in qualsin:
counts[quals] += 1
如果我没有弄错的话,使用计数器(在2.7或如上所述的本地生产中)会将时间复杂度降低N倍。 list.count
是O(N),你在循环中这样做,所以得到O(N ^ 2)。创建计数器的单次迭代只是O(N),因此对于较大的列表,这可能是一个很大的帮助。
编辑2
要按字母顺序排序获取输出,您所做的只是将已删除的列表(集)转换回排序列表。
ordered_deduped_quals = sorted(set(qualsin))
for quals in ordered_deduped_quals:
...