从列表中查找和删除列表

时间:2014-02-16 11:27:54

标签: python list

我一直试图找到一些已完成我想做的事情,但我找不到任何东西。

我有这个清单,即

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')])

即使该项目被删除,我也收到了错误...

谢谢!

2 个答案:

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