基于另一个“True”/“False”列表的列表的选择元素

时间:2017-01-20 11:27:37

标签: python list

我有两个相同长度的列表。 第一个包含字符串。第二个 - 可以是'True''False'的字符串。

如果第二个列表的第n个元素是'True',我想将第一个列表的第n个元素追加到另一个列表中。

所以,如果我有:

List1:

('sth1','sth2','sth3','sth4') 

列表2:

('True','False','True','False')

结果应为 List3

('sth1','sth3')

如何以这种方式交叉两个列表?

4 个答案:

答案 0 :(得分:13)

使用zip:

public ResultSet executeQuery(final String cql, final Object... values) {
    return executeWithSession(new SessionCallable<ResultSet>() {
        @Override
        public ResultSet executeWithSession(Session session) {
            BoundStatement bs = getStatement(cql, values);
            bs.setConsistencyLevel(consistencyLevel);
            return session.execute(cql);
        }
    });
}

// cache the prepared statement
private BoundStatement getStatement(final String cql, Object... values) {
    Session session = getSession();
    PreparedStatement ps = cache.get(cql);
    // no statement cached, create one and cache it now.
    if (ps == null) {
        ps = session.prepare(cql);
        PreparedStatement old = cache.putIfAbsent(cql, ps);
        if (old != null)
            ps = old;
    }
    return ps.bind(values);
}

示例:

result = [x for x, y in zip(xs, ys) if y == 'True']

答案 1 :(得分:5)

或使用numpy:

import numpy as np
filtered = np.array(List1)[np.array(List2)]

顺便说一句,这只适用于List2中的元素为True / False,而不是“True”/“False”。

答案 2 :(得分:2)

如果您不了解zip

l1 = ('sth1','sth2','sth3','sth4')
l2 = ('True','False','True','False')
l = [x for i,x in enumerate(l1) if l2[i]=='True']
print l
#=> ['sth1', 'sth3']

一个布尔元组会更短:

l1 = ('sth1','sth2','sth3','sth4')
l2 = (True,False,True,False)

l = [x for i,x in enumerate(l1) if l2[i]]
print l

答案 3 :(得分:0)

最简单的方法是如下使用 itertools.compress 方法。

import itertools

list1 = ('sth1','sth2','sth3','sth4')
list2 = ('True','False','True','False')
list2 = map(lambda x: x == 'True', list2)

result = list(itertools.compress(list1, list2))

compress方法返回一个迭代器,所以这就是为什么需要将迭代器对象包装在list

中的原因

我希望这会有所帮助。