我有一个包含2列的csv:
a,x
a,y
a,z
b,1
b,2
b,3
b,4
c,5
c,6
c,7
c,8
我想循环查看第1列,并且只显示第一列中每个值的2个条目。我不关心第二列保留或删除的值,我只想要第一列的每个不同选项的2个条目。
输出看起来像这样:
a,x
a,y
b,1
b,2
c,5
c,6
我熟悉csv模块(如何读/写/替换),但我很难找到解释如何将一行与另一行进行比较的资源。我认为这就是我遇到这个问题的地方。
答案 0 :(得分:0)
我会使用字典来解决这个问题,可能是以下几点:
dict = {}
rows = [['a', 'x'], ['a', 'y'], ['a', 'z'], ['b', 1], ['b', 2], ['b', 3], ['b', 4], ['c', 5], ['c', 6], ['c', 7], ['c', 8]]
for row in rows:
if row[0] not in dict.keys():
dict[row[0]] = []
if len(dict[row[0]]) == 2:
continue
dict[row[0]].append(row[1])
print(dict)
输出:
>> {'a': ['x', 'y'], 'b': [1, 2], 'c': [5, 6]}
答案 1 :(得分:0)
所以,这是一个基于雅各布的想法:
创建两个词组,first
和second
对于CSV中的每一行:
second
,请跳过,否则first
放在那里first
,且该值不是您要去的行,请将密钥添加到second
最后,您可以根据需要使用两个带有值的词典 您可以通过创建字典列表来概括它以保持N值,并使用您需要的数量
答案 2 :(得分:0)
以下是itertools.groupby
import itertools
with open("test.csv", "r") as stuff:
data = stuff.readlines()
out = []
for k,dat in itertools.groupby(data, key=lambda x: x[0]):
twoVals = list(dat)[:2]
out.append(twoVals)
print out
对于少于两个值的情况
import itertools
with open("test.csv", "r") as stuff:
data = stuff.readlines()
out = []
for k,dat in itertools.groupby(data, key=lambda x: x[0]):
dat = list(dat)
try:
vals = dat[:2]
except IndexError:
vals = list(dat)
out.append(vals)
print out
我测试了这个:
a,x
a,y
a,z
b,1
b,2
b,3
b,4
c,5
c,6
c,7
c,8
z,1