此代码从CSV文件中读取每一行。第一列是字典中的值。我想将键的值限制为三(使用最近的三个值。)
for row in reader:
key = row[0]
if key in result:
# if the key is in dictionary
result[key].append(row[1])
# add what ever is in column 2 to that key
if len(result[key]) > 3:
# if the result is three !!
print ("too long")
lastThreeValues = (result[key][-3]).copy()
result[key].clear()
result[key] = (lastThreeValues)
else:
result[key] = [row[1]]
工作代码是这个
reader = csv.reader(open("class1.csv"))
result = {}
for row in reader:
key = row[0]
if key in result:
result[key].append(row[1])
if len(result[key]) > 3:
result[key] = (result[key][-3:])
答案 0 :(得分:1)
这比实际需要的要复杂得多,你可以使用切片来删除第一个元素。
>>> a
[0, 1, 2, 3]
>>> a = a[1:]
>>> a
[1, 2, 3]
我所做的就是告诉它将列表设置为从索引1到结尾等于自己。所以基本上就是切掉列表的第一个元素,这是你最早的价值。
虽然jonrsharpe在评论中指出,使用[-3:]更整洁,因为它字面意思是列表中的最后三个元素。
>>> a = a[-3:]
>>> a
[1, 2, 3]
答案 1 :(得分:0)
您可以使用collections.deque
大大简化results
词典的创建。唯一的复杂因素是您之后可能需要将其所有值转换为list
s,但可以使用一行代码完成。
这就是我的意思:
from collections import deque
MAXLEN = 3
for row in reader:
key = row[0]
if key in result:
result[key].append(row[1])
else:
result[key] = deque([row[1]], MAXLEN)
# convert result values into lists
result = {k: list(v) for k, v in result.iteritems()}