我一直在试图找到一些已经完成我想要做的事情的帖子,但我找不到任何东西。
我有这个列表,即
rows =
[['Jan 31', ' 2014 19:48:30.096606000', '0x10', '0x00000000', '0x0f7864ef', '0x0f7864f1', '', 'blahblah', 'other n'],
['Jan 31', ' 2014 19:48:30.829329000', '0x10', '0x00000000', '0x0f920978', '0x0f92097a', '', 'blahblah', 'anotherr n']]
我需要找到并从按第 5 项搜索的列表中删除一个列表,如下所示:
search == '0x0f7864ef'
if any(e[4] == search for e in rows):
如果搜索的var存在,那么我会得到一个True,但我不知道如何从"行"中删除它。做类似rows.remove(e)
的事情只会返回一个错误
我尝试遍历一个集合并在找到时删除,但我遇到了错误。另外,我宁愿不必循环浏览集合/列表。这是我尝试过的:
>>> a = {( '1','da','vi' ), (2,'be','vi') }
>>> for item in a:
... if 'da' in item:
... a.remove(item)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: Set changed size during iteration
>>> a
set([(2, 'be', 'vi')])
即使该项目已被删除,我也收到了一个错误...
谢谢!
只需创建一个过滤项目的新列表,如下所示:
new_list = [item for item in rows if search not in item]
这是一个列表推导式,它是一个计算为列表的表达式。编写上述内容的较长方法是在 for + if 循环中,如下所示:
new_list = []
for item in rows:
if search not in item:
new_list.append(item)
修改你正在循环的列表是非常糟糕的做法,这就是为什么标准做法是创建一个新列表;要么使用列表理解,要么使用更传统的循环。
在迭代列表时,切勿在列表中插入/删除元素。相反,您可以使用高阶函数,例如 filter
。
在 Python 2.7 中:
>>> filter(lambda e: e[4] != '0x0f7864ef', rows)
[['Jan 31',
' 2014 19:48:30.829329000',
'0x10',
'0x00000000',
'0x0f920978',
'0x0f92097a',
'',
'blahblah',
'anotherr n']]
在 Python 3.x 中(filter
返回一个生成器):
>>> filter(lambda e: e[4] != '0x0f7864ef', rows)
<builtins.filter at 0x7f76e2432810>
>>> list(filter(lambda e: e[4] != '0x0f7864ef', rows))
[['Jan 31',
' 2014 19:48:30.829329000',
'0x10',
'0x00000000',
'0x0f920978',
'0x0f92097a',
'',
'blahblah',
'anotherr n']]
为了便于阅读,您可能更喜欢定义命名函数,而不是使用 lambda。