1

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

最初,我想要的是删除低于一定长度的所有字符串的 data[i],然后删除 a.xml 中的相应条目。为此,我使用了以下内容:

iselectors = [x is not len(str(x))>1 for x in data]
data=list(itertools.compress(data, iselectors))
a=list(itertools.compress(a, selectors))

..效果很好。现在,我需要向我的 iselector 添加另一个条件,它指出只有当“tempstring is in a[i]”并且 len(str(x))>1..

所以,我尝试过类似的方法:

iselectors = [tempstring in a and x is not len(str(x))>1 for x in data]

...但我不确定这是正确的,因为当我使用“tempstring in a”时,我认为我不会遍历整个 a

任何指导将不胜感激。谢谢。

4

2 回答 2

2

我认为你只需要同时迭代两者

iselectors = [len(str(x))>1 and tempstring in y for x,y in zip(data,a)]
于 2012-11-23T13:50:02.693 回答
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。

于 2012-11-23T13:50:42.163 回答