我正在尝试在Python 3.6中使用map
,filter
和reduce
。我想要做的是,给定一个 词典列表 ,将与某个键相关联的所有值更改为小写值。例如:
message_one = {"content": "I'm glad I know sign language, it's pretty handy."}
message_two = {"content": "I am on a seafood diet. Every time I see food, I eat it."}
message_three = {"content": "Labyrinths are amazing."}
messages = [message_one , message_two , message_three]
print(to_lowercase(tweets))
#to_lowercase should just return the a list of dictionaries, but content lower-cased.
我最初尝试使用 map 。
def to_lowercase(messages):
lower_case = map(lambda x: x["content"].lower(), messages)
return lower_case
但是,这似乎只返回列表中所有内容消息的列表,并且不会保留字典格式。
我不相信reduce
在这种情况下是正确的,因为我不打算在最后返回单个值,而filter
似乎在这里没有意义。
我如何使用map
,reduce
或filter
来完成这项工作?
答案 0 :(得分:3)
使用小写值获取新dicts列表的简单解决方案:
dicts = [{k:v.lower() for k,v in d.items()} for d in messages]
print(dicts)
输出:
[{'content': "i'm glad i know sign language, it's pretty handy."}, {'content': 'i am on a seafood diet. every time i see food, i eat it.'}, {'content': 'labyrinths are amazing.'}]
答案 1 :(得分:2)
(注意,这个答案假设您使用的是Python 2;如果您使用的是Python 3,请考虑map()
返回迭代器,并且您需要添加一个某种循环看到结果)。
如果你坚持使用map()
,那么你想要创建一个新函数来应用于每个现有字典:
def dict_lowercase_content(d):
"""Produces a copy of `d` with the `content` key lowercased"""
copy = dict(d)
if 'content' in copy:
copy['content'] = copy['content'].lower()
return copy
def to_lowercase(tweets):
return map(dict_lowercase_content, tweets)
dict_lowercase_content()
不假设字典中存在哪些键;它会创建一个所有密钥的浅层副本,而如果一个content
密钥,则它是小写的。
当然,如果你可以确定只有content
密钥是重要的并且始终存在,你可以用这个密钥创建全新的字典;
def to_lowercase(tweets):
return map(lambda d: {'content': d['content'].lower()}, tweets)
如果更新词典 in-place 然而(这会更有效),只需使用循环:
def to_lowercase(tweets):
for tweet in tweets:
if 'content' in tweet:
tweet['content'] = tweet['content'].lower()
请注意,此函数返回None
!这是Python惯例;当就地修改可变对象时,不要再次返回这些对象,因为调用者已经有了引用。
您无法使用reduce()
或filter()
来完成此项工作。
filter()
从可迭代中选择元素。你没有选择,你正在改变。
reduce()
聚合元素;输入中的每个元素与运行结果一起传递给函数;函数返回的任何内容都被视为更新结果。想想总结,连接或遍历树。同样,你没有聚合,你正在改变。
答案 2 :(得分:2)
使用map
:
map(lambda x: {'content': x['content'].lower()}, messages)
没有map
:
[{'content': x['content'].lower()} for x in messages]
没有map
,但更强大:
[{y: x[y].lower()} for x in messages for y in x]
答案 3 :(得分:2)
map()是一个内置的高阶函数,用于转换集合。我们提供一个匿名函数(lambda)来执行map,而不是将集合作为参数本身提供。实现目标的一种方法是:
div