2013-04-11 62 views
1

Python新手在这里。我有一个列表的字典,像这样:如何迭代包含列表和删除项目的字典值?

d = { 
    1: ['foo', 'foo(1)', 'bar', 'bar(1)'], 
    2: ['foobaz', 'foobaz(1)', 'apple', 'apple(1)'], 
    3: ['oz', 'oz(1)', 'boo', 'boo(1)'] 
} 

我试图通过字典的键和相应的列表值弄清楚如何循环,并用括号尾删除所有的字符串中的每个列表。到目前为止,这是我:

for key in keys: 
    for word in d[key]...: # what else needs to go here? 
     regex = re.compile('\w+\([0-9]\)') 
     re.sub(regex, '', word) # Should this be a ".pop()" from list instead? 

我想用一个列表理解来做到这一点,但正如我所说的,我无法找到通过字典键循环和相应的列表字典值多的信息。什么是最有效的设置方法?

+0

你会碰到这个问题不是特有的碰巧是列表字典值。您应该通过搜索诸如“在迭代时修改列表”等方式获得有用的信息。然而,eumiro关于用修改来创建一个新字典的回答,而不是现场修改现有值的最终结果 - 运行这些问题。 – lvc 2013-04-11 13:07:23

+0

你的名单的项目,他们是字符串?或者一些对象? – Eric 2013-04-11 14:16:14

+0

@Eric他们是字符串。感谢您指出 - 编辑的例子。 – 2013-04-11 15:35:57

回答

7

您可以重新建立词典,通过让没有括号仅元素:

d = {k:[elem for elem in v if not elem.endswith(')')] for k,v in d.iteritems()} 
1
temp_dict = d 
for key, value is temp_dict: 
    for elem in value: 
     if temp_dict[key][elem].find(")")!=-1: 
      d[key].remove[elem] 

在遍历它,你不能编辑清单,让您创建列表的副本temp_list,如果您在其中找到括号尾部,则从您的原始列表中删除相应的元素。

1

或者,你可以不用重建的字典,这可能是最好,如果它是巨大的......

for k, v in d.iteritems(): 
    d[k] = filter(lambda x: not x.endswith(')'), v)