使python itertools在多种条件下工作

时间:2012-11-23 13:31:48

标签: python itertools

我正在尝试学习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。

非常感谢任何指导。 感谢。

2 个答案:

答案 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.