我有一个有趣的问题。我有一个列表列表,我希望除了每个列表的第一个元素编译成正则表达式。然后回到列表中。列表以字符串开头。
以下代码不起作用。它不会引发错误,它似乎什么也没做。我想我已经确定了这个问题。 (见下文)
代码:
for i in range(len(groups)):
for j in range(len(groups[i][1:])):
groups[i][1:][j] = re.compile(groups[i][1:][j])
我认为问题在于,list[1:] = [1,2,3]
有效,list[1:][1] = 2
不起作用。
适当的解决办法是什么?
答案 0 :(得分:2)
#!/usr/bin/env python
import re
lol = [
["unix", ".*", "cool(, eh)?"],
["windows", "_*.*", "[wft]*"],
]
# think of `il` as inner list and `ii` as inner item (if you need) ...
print [ ii[:1] + map(re.compile, ii[1:]) for ii in [ il for il in lol ]]
# ... or, since list comprehensions are preferred over `map`
print [ ii[:1] + [re.compile(x) for x in ii[1:]] for ii in [ il for il in lol ]]
将屈服:
[['unix', <_sre.SRE_Pattern object at 0x100559b90>, <_sre.SRE_Pattern object
at 0x10052b870>], ['windows', <_sre.SRE_Pattern object at 0x100590828>,
<_sre.SRE_Pattern object at 0x10049b780>]]
答案 1 :(得分:1)
为什么要用切片来打扰?为什么不做......
for i in range(len(groups)):
for j in range(1, len(groups[i])):
groups[i][j] = re.compile(groups[i][j])
a[:2] = [1,2,3]
的原因是替换前3个元素一个清单。
如果您实际创建了一个切片,然后尝试索引它(la a[1:][0]
),那么您实际上正在索引到切片对象(然后修改切片对象)而不是触摸原始对象。
答案 2 :(得分:0)
您应该提供更详细的工作示例以进一步调查。但是,你提到的问题似乎并不是一个问题。它确实有效。除非,我误解了一些事情。
>>> a=[1,2,3,4]
>>> a[1:]
[2, 3, 4]
>>> a[1:][0]
2
>>> a[1:][1]
3