2017-04-02 47 views
2

有一个问题,从字符串的两个列表和阵列使第三列表出来的相同字符串:比较表2所列出(字符串和数组)

d = [('O', array([ 0.034  , -0.31900001, 1.18900001], dtype=float32)), 
    ('H', array([ 0.29499999, 4.56899977, 1.44500005], dtype=float32)), 
    ('O', array([ 0.30500001, 7.00199986, 1.88199997], dtype=float32)), 
    ('H', array([ 0.215  , 11.07900047, 1.52199996], dtype=float32)), 
    ('O', array([ 0.23999999, 13.68999958, 1.99199998], dtype=float32)), 
    ...] 
v = [('H', array([ 0.64899999, 1.29700005, 3.33400011], dtype=float32)), 
    ('O', array([-0.131  , 3.41700006, 3.31900001], dtype=float32)), 
    ('H', array([ 0.764  , 7.69399977, 3.61800003], dtype=float32)), 
    ('O', array([ 0.15000001, 10.2130003 , 3.273  ], dtype=float32)), 
    ('H', array([ 1.01499999, 14.08399963, 3.7420001 ], dtype=float32)), 
    ...] 

结果我需要应该包含所有“^ h “两份名单和这些H(定期)

result = [('H', array([ 0.29499999, 4.56899977, 1.44500005], dtype=float32)), 
     ('H', array([ 0.64899999, 1.29700005, 3.33400011], dtype=float32)), 
     ('H', array([ 0.215  , 11.07900047, 1.52199996], dtype=float32)), 
     ('H', array([ 0.764  , 7.69399977, 3.61800003], dtype=float32)), 
     ('H', array([ 1.01499999, 14.08399963, 3.7420001 ], dtype=float32)), 
     ...] 

是想不同的选择,但要坚持unhashable类型的所有坐标:‘numpy.ndarray’每当我试图使它在一个循环:

result=list(set(d[0][1:]) & set(v[0][1:])) 

非常感谢您的意见和建议。

回答

1

您可以将列表d和v,选择项目,包含一个“H”:

[x for x in d + v if x[0] == 'H'] 

编辑: 的建议上面会在内存中创建一个新的列表,同时包含d和诉更高效存储,你冷用itertools.chain

from itertools import chain  
[x for x in chain(d, v) if x[0] == 'H'] 
+0

你可以连续使用清单[**'itertools.chain' **](https://docs.python.org/2/library /itertools.html#itertools.chain),所以你不必创建一个新的组合列表:'[x for x in chain(d,v)if x [0] =='H']' –

+0

@PeterWood酷!但是对于问题中提供的小示例数据集,它似乎稍微慢一些。 –

+0

非常感谢,这工作:[x for x in chain(d,v)if x [0] [0] =='H'] –