如何在删除换行符的同时迭代dict?

时间:2016-07-12 00:18:31

标签: python dictionary

我正在尝试遍历字典并删除换行符,并且难以解析项目。

说我们有

line_contents = {"user_id": "6GrH6gp09pqYykGv86D6Dg", "text": "Decent selection of more than just bar food. \n\nJumbo fish sandwich is aptly named. \n\nSeem to be generous with the pour.", "business_id": "fNGIbpazjTRdXgwRY_NIXA", "likes": 0, "date": "2013-04-22", "type": "tip"}

#I've tried:
line_contents=dict(map(strip(),x) for x in line_contents.items())
#but ^ doesn't work. I can't figure out how the map function or the dictionary comprehension works

#I eventually want:
line_contents = {"user_id": "6GrH6gp09pqYykGv86D6Dg", "text": "Decent selection of more than just bar food. Jumbo fish sandwich is aptly named. Seem to be generous with the pour.", "business_id": "fNGIbpazjTRdXgwRY_NIXA", "likes": 0, "date": "2013-04-22", "type": "tip"}

我很想用一个典型的for循环遍历字典元素,但我想尝试dict理解,因为我从来没有。

2 个答案:

答案 0 :(得分:4)

实际上,你没有使用词典理解。这是一个带有单个参数的函数调用:一个生成器表达式。字典理解更像是这样:

line_contents = {key: value.replace("\n", "") for key, value in line_contents.items()}

编辑:niemmi明确指出这些值不是所有字符串。因此,你应该使用类似于他的建议:

line_contents = {k: v.replace("\n", "") if isinstance(v, basestring) else v for k,v in line_contents.items()}

我使用basestring代替niemmi的str,因为它们实际上是unicode。在Python 3中,您应该使用str

你的错误是什么?好吧,你给了dict一个参数。考虑一下:

argument = []
for x in line_contents.items():
    argument.append(map(strip(), x))

line_contents = dict(argument)

这就是你正在做的事情。对于每个键值对,您将map()两个参数strip()x。对于map(strip(), x)的一次调用,您实际上是这样做的:

function = strip()
result = []
for item in x:
    result.append(function(item))

现在你必须看到问题。首先,strip未定义。另外,你应该为map提供一个函数,而不是函数返回的函数。如果您想使用str.strip,请执行以下操作:

map(str.strip, x)

问题在于str.strip()从末端剥离;它不会删除出现在中间的新行。

答案 1 :(得分:3)

你可以使用dict理解,但由于你的某些值不是字符串,你必须考虑到这一点:

line_contents = {k: v.replace('\n', '') if isinstance(v, str) else v for k, v in line_contents.items()}

如果键和值都包含换行符,您可以使用dict内置:

line_contents = dict([y.replace('\n', '') if isinstance(y, str) else y for y in x] 
                     for x in line_contents.items())

当然dict理解仍然可行,但看起来很混乱:

line_contents = {k: v for k, v in
                 ([y.replace('\n', '') if isinstance(y, str) else y for y in x]
                  for x in line_contents.items())
                 }