2016-01-08 139 views
0

我有三個數組,每個入口都有時間戳。我舉一個簡單的一維例如:並行匹配數組Python

A=[1 4 5 2 6 3 4 8] 
B=[1 2 3 4] 
C=[4 5 6 7 8] 

我的腳本應得到作爲結果的兩個陣列,匹配從A到B並從A到C的元素,例如:

new_B=[1 2 3 4 
     1 2 3 4] 

new_C=[4 5 6 7 8 
     4 5 6 - 8] 

其中添加的第二行對應於現在排序的A中的元素。正如你所看到的,可能會發生A中缺少一些元素。在這種情況下,應該添加「 - 」。

任何想法是最好的辦法嗎?

+0

缺少逗號和'array'的使用表明這些可能是'numpy'數組,而不是標準'list'結構。那是對的嗎? –

+0

我意識到我簡化了我的問題。實際上,我有三個數組列表,其中兩個數組要匹配的條件是(1)數組元素之一的匹配(整數)和(2)數組中包含的時間戳之間的差異低於一定的閾值... – mbezunartea

+0

你正在改變這個問題,但仍然不清楚。下面的三個答案回答你當前的問題。如果您的數據實際上不是您所展示的數據,請使用真實數據正確更新問題,甚至更好地使用真實數據開啓一個新問題。 –

回答

1

這個工作對我來說:

def match_array(A, B): 
    matches = [] 
    for elem in B: 
     if elem in A: 
      matches.append(elem) 
     else: 
      matches.append("-") 
    return [B, matches] 

它返回一個列表,包含兩個列表自身的:原來的名單進行匹配,匹配的結果。

0

方式一:

>>> def compare(a,b): 
    result = [b,[]] 
    for x in b: 
     if x in a: 
      result[1].append(x) 
     else: 
      result[1].append('-') 
    return result 

>>> compare(A,B) 
[[1, 2, 3, 4], [1, 2, 3, 4]] 
>>> compare(A,C) 
[[4, 5, 6, 7, 8], [4, 5, 6, '-', 8]] 
>>> 

即使列表解析,就可以做到這一點:

>>> A=[1, 4, 5, 2, 6, 3, 4, 8] 
>>> B=[1, 2, 3, 4] 
>>> C=[4, 5, 6, 7, 8] 
>>> [B,[x if x in A else '-' for x in B]] 
[[1, 2, 3, 4], [1, 2, 3, 4]] 
>>> [C,[x if x in A else '-' for x in C]] 
[[4, 5, 6, 7, 8], [4, 5, 6, '-', 8]] 
2

我會使用Python sets更有效地在A尋找大型陣列,並列出理解加快搜索:

def match_arrays(A,B): 
    A = set(A) 
    return [B, [b if b in A else '-' for b in B]] 

然後:

>>> match_arrays([1,2,3], [1,2,3]) 
[[1, 2, 3], [1, 2, 3]] 
>>> match_arrays([1,2,3], [1,4,3]) 
[[1, 2, 3], [1, '-', 3]]