从CSV fi中提取没有重复项的列表

2024-05-08 20:40:18 发布

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

我有一个数据集如下:

id,created_at,username
1,2006-10-09T18:21:51Z,hey
2,2007-10-09T18:30:28Z,bob
3,2008-10-09T18:40:33Z,bob
4,2009-10-09T18:47:42Z,john
5,2010-10-09T18:51:04Z,brad
...

我包含1米以上的线路。 我想用python提取用户名列表,不需要重复。到目前为止,我的代码如下:

^{pr2}$

我有几个问题: 1-我的输出输入用户.csv看起来像这样:

^{3}$

如何删除每个字母之间的逗号?在

2-我的代码不是很优雅,有没有办法把csv文件作为一个矩阵导入,选择最后一行,然后使用一个优雅的库,比如下划线.js在javascript中删除重复项?在

非常感谢


Tags: csv数据代码id列表usernamejohn用户名
3条回答

改变

writer.writerow(row[2])

^{pr2}$

另外,检查列表中的成员关系在计算上是非常昂贵的[O(n)]。如果您要检查大量项集合中的成员资格,并且经常这样做,请使用set[O(1)]:

L = set()
reader.next() # Skip the header
for row in reader:
    if row[2] not in L:
        L.add(row[2])
        writer.writerow([row[2]])

或者

如果您可以使用几兆字节的内存,请执行以下操作:

with open("sample.csv", "rb") as infile:
    reader = csv.reader(infile)
    reader.next()
    no_duplicates = set(tuple(row) for row in reader)

    with open("users.csv", "wb") as outfile:
        csv.writer(outfile).writerows(no_duplicates)

如果顺序很重要,请使用OrderedDict而不是集合:

from collections import OrderedDict
with open("sample.csv", "rb") as infile:
    reader = csv.reader(infile)
    reader.next()
    no_duplicates = OrderedDict.fromkeys(tuple(row) for row in reader)

    with open("users.csv", "wb") as outfile:
        csv.writer(outfile).writerows(no_duplicates.keys())

简单又简短!

for line in reader:
    string = str(line)
    split = string.split("," , 2)
    username = split[2][2:-2]

您可以在这里使用set,它提供O(1)项查找,与列表的O(N)相比。在

seen = set()
add_  = seen.add
next(reader) #skip header
writer.writerows([row[-1]] for row in reader if row[-1] not in seen
                                                        and not add_(row[-1]))

并且始终使用with语句来处理文件,它会自动为您关闭文件:

^{pr2}$

相关问题 更多 >