我一直试图找到一些已完成我想做的事情,但我找不到任何东西。
我有这个清单,即
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')])
即使该项目被删除,我也收到了错误...
谢谢!
答案 0 :(得分:3)
只需创建一个包含已过滤项目的新列表,如下所示:
new_list = [item for item in rows if search not in item]
这是 list comprehension ,它是一个以列表形式计算的表达式。编写上述内容的较长方法是在for + if循环中,如下所示:
new_list = []
for item in rows:
if search not in item:
new_list.append(item)
修改一个循环的列表是非常糟糕的做法,这就是为什么标准做法是创建一个新列表;无论是列表理解还是更传统的循环。
答案 1 :(得分:0)
在迭代时,不应该在列表中插入/删除元素。
相反,您可以使用更高阶的函数,例如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。