我正在尝试学习python itertools(到目前为止爱它!),但我遇到了一个问题。我有以下两个列表:
a=["http://www.xyz.com/jhuh7287", "http://www.hjuk.com/kashjh716", "http://www.psudjg.com/9279jshkoh", "http://www.xyz.com/jhuh7287", "http://www.xyz.com/9289jhjbg"]
data=["k","some small string here", "so med string here", "some string here","l"]
tempstring="http://www.xyz.com"
最初,我想要的是删除所有低于一定长度的字符串的数据[i],然后删除a中的相应条目。为此,我使用了以下内容:
iselectors = [x is not len(str(x))>1 for x in data]
data=list(itertools.compress(data, iselectors))
a=list(itertools.compress(a, selectors))
..效果很好。现在,我需要为我的iselectors添加另一个条件,它指出只有当" tempstring在[i]"和len(str(x))> 1 ..
所以,我尝试过类似的事情:
iselectors = [tempstring in a and x is not len(str(x))>1 for x in data]
...但我不确定这是对的,因为当我在"
中使用" tempstring时,我不认为我正在迭代整个a。非常感谢任何指导。 感谢。
答案 0 :(得分:2)
我认为你只需要同时迭代两者
iselectors = [len(str(x))>1 and tempstring in y for x,y in zip(data,a)]
答案 1 :(得分:2)
最简单的方法是通过:
>>> pprint(zip(data, a))
[('k', 'http://www.xyz.com/jhuh7287'),
('some small string here', 'http://www.hjuk.com/kashjh716'),
('so med string here', 'http://www.psudjg.com/9279jshkoh'),
('some string here', 'http://www.xyz.com/jhuh7287'),
('l', 'http://www.xyz.com/9289jhjbg')]
>>> [ (av, dv) for av, dv in zip(a, data) if len(av) > 1 and tempstring in av]
[('http://www.xyz.com/jhuh7287', 'k'), ('http://www.xyz.com/jhuh7287', 'some string here'), ('http://www.xyz.com/9289jhjbg', 'l')]
所以进行一些重构:
selectors = (tempstring in dv for av, dv in izip(a, data) if len(av) > 1)
由于@mgilson以一个关键点删除了他的答案 - 我希望OP已经加入,我将重新发布他的答案:
此外,
is
用于比较对象标识。虽然这项检查有效 对于Cpython中的小整数(1是len(str(1))),它不能保证 与其他python实现一起工作(也不保证 将来在Cpython工作)。我想你只想要len(str(x))> 1.