0

所以我有一个这样的脚本

for key, Value in mydictionary.iteritems():
    if 'Mammal' in Value[1]: 
    #because the value is a list of 2 items and I want to get at the second one
        Value[1] = Value[1].strip('Mammal')

此代码有效地从 Value 列表中第二项的开头删除了 Mammal。现在我想用列表理解来制作这个更好看的python,所以我想出了这个但显然是错误的......有什么帮助吗?

Value[1] = [Value[1].strip('Mammal') for Key, Value in mydictionary.iteritems() if 'Mammal' in Value[1] ]

此外,在同一行上,列表推导列出了该字典中的所有键。我很难想出那个。

我想出了:

for key, Value in mydictionary.iteritems():
Templist.append(key)

但作为一个列表理解我在想....但它不起作用:(

alist = [key for Key, Value in mydictionary.iteritems()]
4

4 回答 4

1
mydictionary = {
    1: [4, "ABC Mammal"],
    2: [8, "Mammal 123"],
    3: [15, "Bird (Not a Mammal)"]
}

mydictionary = {key: ([value[0], value[1].strip('Mammal')] if 'Mammal' in value[1] else value) for key, value in mydictionary.iteritems()}
print mydictionary

输出:

{1: [4, 'ABC '], 2: [8, ' 123'], 3: [15, 'Bird (Not a Mammal)']}

虽然我不会客观地称这为“更好看”,但迭代方法可能更可取。

于 2012-10-22T12:00:13.057 回答
0

列表理解创建一个新列表

如果您能够使用strip(),那么Value[1]是一个字符串 - 而不是一个列表

您可以仅使用字典方法keys()进行第二部分- 您的两次尝试都是多余的。

alist = mydictionary.keys()
于 2012-10-22T11:56:34.300 回答
0

您不应该仅仅使用列表推导来产生副作用。你可以,但它被认为是不好的做法,你应该坚持for循环。

无论如何,由于您正在使用字典,因此您可能正在寻找字典理解

mydictionary = {'foo': ['unknown', 'Mammal is great'],
                'bar': ['something', 'dont touch me']}

mydictionary = {k: [a, b.replace('Mammal', '', 1)] for k, [a, b] in mydictionary.iteritems() if b.startswith('Mammal')}

另请注意,如果使用 dict 理解,则创建一个新字典而不是替换旧字典中的值。


...
Value[1] = Value[1].strip('Mammal')
...

此代码有效地从 Value 列表中第二项的开头删除了 Mammal。

不,不是的。它替换该项目开头和结尾的所有出现的Ma和。最好使用该方法将第一次出现的 替换为空字符串。mlreplaceMammal


alist = [key for Key, Value in mydictionary.iteritems()]

你这里有一个错字。它应该是:

alist = [key for key, value in mydictionary.iteritems()]

要不就

alist = mydictionary.keys()
于 2012-10-22T12:03:56.147 回答
0
mydict = {'a':['Mammal','BC','CD'],
        'b':['AB','XY','YZ'],
        'c':['Mammal','GG','FD'],}

print [x for x,y in mydict.items() if y[0]=='Mammal']
于 2012-10-22T12:03:59.400 回答