我在数组中有两个数据集:
arr1 = [
['2011-10-10', 1, 1],
['2007-08-09', 5, 3],
...
]
arr2 = [
['2011-10-10', 3, 4],
['2007-09-05', 1, 1],
...
]
我想将它们组合成一个这样的数组:
arr3 = [
['2011-10-10', 1, 1, 3, 4],
...
]
我的意思是,只需将这些行与相同的date
列合并。
谢谢大家,为了澄清,我不需要那些没有出现在两个数组中的行,只需删除它们。
答案 0 :(得分:6)
以不同方式整理您的数据(您可以轻松将您已有的数据转换为两个dict
):
d1 = { '2011-10-10': [1, 1],
'2007-08-09': [5, 3]
}
d2 = { '2011-10-10': [3, 4],
'2007-09-05': [1, 1]
}
然后:
d3 = { k : d1[k] + d2[k] for k in d1 if k in d2 }
答案 1 :(得分:3)
值得一提的是设置数据类型。因为他们的方法符合问题的类型。集合运算符允许您轻松灵活地连接集合,包括完整,内部,外部,左,右连接。与字典一样,集合不会保留顺序,但如果将集合强制转换为列表,则可以在结果集合上应用顺序。或者,您可以使用o rdered dictionary。
set1 = set(x[0] for x in arr1)
set2 = set(x[0] for x in arr2)
resultset = (set1 & set2)
这只能让你在原始列表中结合日期,为了重建arr3,你需要在arr1和arr2中追加[1:]数据,其中日期在结果集中。这种重建不如使用上面的字典解决方案那么整洁,但使用集合值得考虑类似的问题。
答案 2 :(得分:2)
您可以将数组转换为dict,然后再转回。
d1 = dict((x[0],x[1:]) for x in arr1)
d2 = dict((x[0],x[1:]) for x in arr2)
keys = set(d1).union(d2)
n = []
result = dict((k, d1.get(k, n) + d2.get(k, n)) for k in keys)
答案 3 :(得分:1)
单一字典方法:
tmp = {}
# add as many as you like into the outermost array.
for outer in [arr1,arr2]:
for inner in outer:
start, rest = inner[0], inner[1:]
# the list if key exists, else create a new list. Append to the result
tmp[start] = tmp.get(start,[]) + rest
output = []
for k,v in tmp.iteritems():
output.append([k] + v)
这相当于一个完整的外连接(即使一边为空,也从两边返回数据)。如果您想要内部联接,可以将其更改为:
tmp = {}
keys_with_dupes = []
for outer in [arr1,arr2]:
for inner in outer:
start, rest = inner[0], inner[1:]
original = tmp.get(start,[])
tmp[start] = original + rest
if original:
keys_with_dupes.append(start)
output = []
for k in keys_with_dupes:
v = tmp[k]
output.append([k] + v)
答案 4 :(得分:1)
生成器函数方法,跳过日期不匹配的相应元素:
import itertools
def gen(a1, a2):
for x,y in itertools.izip(a1, a2):
if x[0] == y[0]:
ret = list(x)
ret.extend(y[1:])
yield ret
else:
continue
>>print list(gen(arr1, arr2))
[['2011-10-10', 1, 1, 3, 4]]
但是,如果可能的话,以不同的方式组织您的数据。
答案 5 :(得分:0)
除非两者都是非常大的列表,否则我会使用字典:
arr1 = [
['2011-10-10', 1, 1],
['2007-08-09', 5, 3]
]
arr2 = [
['2011-10-10', 3, 4],
['2007-09-05', 1, 1]
]
table_1 = dict((tup[0], tup[1:]) for tup in arr1)
table_2 = dict((tup[0], tup[1:]) for tup in arr2)
merged = {}
for key, value in table_1.items():
other = table_2.get(key)
if other:
merged[key] = value + other
否则,对每个进行排序会更有效,然后以这种方式进行合并。但我认为,在大多数情况下,这将足够快。