gpt4 book ai didi

python - 将 for 循环转换为列表理解

转载 作者:行者123 更新时间:2023-11-28 19:41:35 25 4
gpt4 key购买 nike

我正在尝试将以下内容转换为列表理解但很挣扎:

lorem_ipsum = """Lorem ipsum dolor sit amet, consectetur adipiscing elit."""

def word_count2(str):
counts = dict()
words = str.split()

for word in words:
if word in counts:
counts[word] += 1
else:
counts[word] = 1

return counts

print(word_count2(lorem_ipsum))

到目前为止,我已经尝试了一些变体:-

aString = lorem_ipsum

counts = dict()
words = aString.split

[counts[word] += 1 if word in counts else counts[word] = 1 for word in words]

不幸的是,现在已经有几个小时了,但我尝试过的一切似乎都不起作用

最佳答案

警告!您正在尝试在列表理解中使用副作用:

[counts[word] += 1 if word in counts else counts[word] = 1 for word in words]

尝试更新每个单词计数。列表理解不应该像那样使用。

itertools.Counter 旨在解决您的问题,您可以使用对每个元素进行计数的字典理解(参见其他答案)。但是 dict 理解具有 O(n^2) 复杂性:对于列表的每个元素,阅读完整列表以找到该元素。如果您想要功能性的东西,请使用折叠:

>>> lorem_ipsum = """Lorem ipsum dolor sit amet, consectetur adipiscing elit."""
>>> import functools
>>> functools.reduce(lambda d, w: {**d, w: d.get(w, 0)+1}, lorem_ipsum.split(), {})
{'Lorem': 1, 'ipsum': 1, 'dolor': 1, 'sit': 1, 'amet,': 1, 'consectetur': 1, 'adipiscing': 1, 'elit.': 1}

对于每个单词 w,我们更新当前字典:d[w] 替换为 d[w]+1(或0+1 如果 w 不在 d 中)。

这给出了如何编写列表理解的提示:

>>> counts = {}
>>> [counts.update({word: counts.get(word, 0) + 1}) for word in lorem_ipsum.split()]
[None, None, None, None, None, None, None, None]
>>> counts
{'Lorem': 1, 'ipsum': 1, 'dolor': 1, 'sit': 1, 'amet,': 1, 'consectetur': 1, 'adipiscing': 1, 'elit.': 1}

如您所见,[None, None, None, None, None, None, None, None] 是列表理解的真正返回值。字典 count 已更新,但不要这样做!。除非使用结果,否则不要使用列表理解。

关于python - 将 for 循环转换为列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56011367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com