我有两个相同长度的列表。
第一个包含字符串。第二个 - 可以是'True'
或'False'
的字符串。
如果第二个列表的第n个元素是'True'
,我想将第一个列表的第n个元素追加到另一个列表中。
所以,如果我有:
List1:
('sth1','sth2','sth3','sth4')
列表2:
('True','False','True','False')
结果应为 List3 :
('sth1','sth3')
。
如何以这种方式交叉两个列表?
答案 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
我希望这会有所帮助。