2015-04-06 115 views
0

我与含纯数值数据列表的工作,我想一个列表中的数值差异方面的数据进行比较:鉴于这种根据数字差异比较列表的最有效方法?

primary_seq = [0, 2, 4, 5, 7, 8, 10] 
    ...Code code code 
primary_pattern = 2^2^1^2^1^2 

sub_seq = [0, 2, 3, 5, 6] 
    ...Code code code 
sub_pattern = 2^1^2^1 

,我想程序到sub_pattern与primary_pattern比较:

>>> primary_pattern >= sub_pattern 
>>> True 

所以,基本上,

221212 <--- Above seq. 
2121 <--- This is a section of the above seq. 
+1

好点,我已经改变了一切代表名单,谢谢! – user2901512 2015-04-06 12:26:28

+0

您是否有意使用模式和子模式按位异或?因为这是'''在Python中做的。 – Shashank 2015-04-06 12:31:34

+1

为什么主要模式大于子模式? – 2015-04-06 12:34:26

回答

0

可以使一个类来计算模式1^2^1^2并定义> =的含义(这似乎是字符串的输入)。

class pattern: 
    pattern='' 
    def __init__(self,lst): 
    pat=str([lst[i+1]-lst[i] for i in range(len(lst)-1)])[1:-1] 
    self.pattern=pat.replace(', ','^') 
    def __repr__(self): return self.pattern 
    def __ge__(self,other): return (other.pattern in self.pattern) 

>>>primary_pattern =pattern(primary_seq) 
>>>sub_pattern = pattern(sub_seq) 
>>>sub_pattern 
2^1^2^1 
>>>primary_pattern >= sub_pattern 
True 
0

假设你的意思的差异之大在比另一个名单意味着> =,那么你可以压缩了自身的名单和总结的区别...

>>> primary_pattern = [abs(a-b) for a,b in zip(primary_seq[1:], primary_seq[:-1])] 
>>> sub_pattern = [abs(a-b) for a,b in zip(sub_seq[1:], sub_seq[:-1])] 
>>> sum(primary_pattern[1:-1]) >= sum(sub_pattern) 
True 

注意:如果序列严格排序,那么你不需要abs()

相关问题