如何同时拆分多个阵列

时间:2014-11-17 11:43:34

标签: python arrays

我有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天采取data1data2,对其执行操作,然后在第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为空。我不知道为什么会这样,如果建议采用更好的方式,我可以完全重启!

提前致谢。

4 个答案:

答案 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循环之外,你实际上并没有返回或使用xy,所以代码似乎无关紧要,可能是你的原因代码没有返回您期望的内容。

答案 1 :(得分:2)

groupbyzip是解决此问题的好方法。它允许您将已排序数据的位组合在一起。 zip允许您将daydata1data2的每个索引处的元素作为元组一起访问。

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)

运行多个线程类似于同时共享相同数据的多个不同程序。您可以为每个数组调用一个线程。

详细了解threading documentation

上的线程