我有3个列表,长度相同。其中一个长度是表示一天的数字,另外两个列表是对应于那一天的数据,例如
day = [1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4....]
data1 = [1,2,3,4,5,6,1,2,3,4,5,1,2,3,4,5,1,2,3,4....] # (effectively random numbers)
data2 = [1,2,3,4,5,6,1,2,3,4,5,1,2,3,4,5,1,2,3,4....] # (again, effectively random numbers)
我需要做的是在第1天采取data1
和data2
,对其执行操作,然后在第2天,第3天,第4天重复此过程,依此类推。< / p>
我目前有:
def sortfile(day, data1, data2):
x=[]
y=[]
date=[]
temp1=[]
temp2=[]
i=00
for i in range(0,len(day)-1):
if day[i] == day[i+1]:
x.append(data1[i])
y.append(data2[i])
i+=1
#print x, y
else:
for i in range(len(x)):
temp1.append(x)
for i in range(len(y)):
temp2.append(y)
date.append(day[i])
x=[]
y=[]
i+=1
while i!=(len(epoch)-1):
x.append(data1[i])
y.append(data2[i])
i+=1
date.append(day[i])
return date, temp1, temp2
这应该附加到x数组,而白天保持不变,然后如果它更改将x数组中的所有数据附加到temp1数组,则清除x数组。然后它将对temp1和temp2执行操作。但是,当我将其作为一个检查运行时(我知道我没有在任何时候清除temp1和temp2),temp1只填充完整的日期列表,temp2为空。我不知道为什么会这样,如果建议采用更好的方式,我可以完全重启!
提前致谢。
答案 0 :(得分:4)
只需压缩列表:
x = []
y = []
date = []
temp1 = []
temp2 = []
day = [1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4]
data1 = [1,2,3,4,5,6,1,2,3,4,5,1,2,3,4,5,1,2,3,4]
data2 = [1,2,3,4,5,6,1,2,3,4,5,1,2,3,4,5,1,2,3,4]
zipped = zip(day, data1,data2) # list(zipped) for python 3
for ind, dy, dt1, dt2 in enumerate(zipped[:-1]):
if zipped[ind+1][0] == dy:
x.append(dt1)
y.append(dt2)
else:
temp1 += x
temp2 += y
x = []
y = []
不确定你的while循环在做什么,因为它在for循环之外,你实际上并没有返回或使用x
和y
,所以代码似乎无关紧要,可能是你的原因代码没有返回您期望的内容。
答案 1 :(得分:2)
groupby
和zip
是解决此问题的好方法。它允许您将已排序数据的位组合在一起。 zip
允许您将day
,data1
和data2
的每个索引处的元素作为元组一起访问。
from operator import itemgetter
from itertools import groupby
day = [1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4]
data1 = [1,2,3,4,5,6,1,2,3,4,5,1,2,3,4,5,1,2,3,4]
data2 = [1,2,3,4,5,6,1,2,3,4,5,1,2,3,4,5,1,2,3,4]
x = []
y = []
for day_num, data in groupby(zip(day, data1, data2), itemgetter(0)):
data = list(data)
data1_total = sum(d[1] for d in data)
x.append(data1_total)
data2_total = sum(d[2] for d in data)
y.append(data2_total)
itemgetter
只是一个函数,告诉groupby
按元组中的第一个元素(日期值)对元素元组进行分组。
答案 2 :(得分:1)
另一个选择是使用defaultdict并简单地迭代days
添加数据:
from collections import defaultdict
d1 = defaultdict(list)
d2 = defaultdict(list)
for n, d in enumerate(day):
d1[d].append(data1[n])
d2[d].append(data2[n])
这会创建两个像{day: [value1, value2...]...}
这样的词组。请注意,此解决方案不需要对days
进行排序。
答案 3 :(得分:0)
运行多个线程类似于同时共享相同数据的多个不同程序。您可以为每个数组调用一个线程。
上的线程