如何在列表理解中的每次迭代中更改变量?
How do I change a variable in each iteration in a list comprehension?
所以我写了这个函数,它接受一个字符串并删除连续的重复单词。
def remove_consecutive_duplicates(s):
previous_string = None
li = []
for i in s.split():
if i != previous_string:
li.append(i)
previous_string = i
return " ".join(li)
input: 'alpha beta beta gamma gamma gamma delta alpha beta beta gamma gamma gamma delta'
output: 'alpha beta gamma delta alpha beta gamma delta'
但我的问题是如何在列表理解中添加 previous_string = i
它?这可能吗?
通常如果没有 previous_string = i
那么我可能会这样做:
def remove_consecutive_duplicates(s):
previous_string = None
return " ".join([i for i in s.split() if i != previous_string])
但我不知道在这种情况下如何或在何处添加 previous_string = i
。
从 Python 3.8 开始你可以使用 assignment expression :=
def remove_consecutive_duplicates(s):
prev = None
return " ".join([prev := i for i in s.split() if i != prev])
它在某些时候可能有点难以理解,但如果您确定要在列表理解中这样做:
def remove_consecutive_duplicates(s):
words = s.split()
return " ".join([words[0]]+[words[i+1] for i in range(len(words)-1) if words[i+1] != words[i]])
test = remove_consecutive_duplicates('alpha beta beta gamma gamma gamma delta alpha beta beta gamma gamma gamma delta')
print(test)
您可以将 itertools 中的 'groupby' 函数与列表理解一起使用,如下所示:
from itertools import groupby
def remove_consecutive_duplicates(s):
return " ".join([word[0] for word in groupby(s.split(" "))])
足够可读。
解决方案
One-line 解决方案:这应该适用于 python 3.6+
[x for x, y in zip(values, values[1:] + [None]) if x!=y]
例子
## Dummy data
s = 'alpha beta beta gamma gamma gamma delta alpha beta beta gamma gamma gamma delta'
# create a list
values = s.split()
## Get required output
[x for x, y in zip(values, values[1:] + [None]) if x!=y]
# ['alpha', 'beta', 'gamma', 'delta', 'alpha', 'beta', 'gamma', 'delta']
所以我写了这个函数,它接受一个字符串并删除连续的重复单词。
def remove_consecutive_duplicates(s):
previous_string = None
li = []
for i in s.split():
if i != previous_string:
li.append(i)
previous_string = i
return " ".join(li)
input:
'alpha beta beta gamma gamma gamma delta alpha beta beta gamma gamma gamma delta'
output:
'alpha beta gamma delta alpha beta gamma delta'
但我的问题是如何在列表理解中添加 previous_string = i
它?这可能吗?
通常如果没有 previous_string = i
那么我可能会这样做:
def remove_consecutive_duplicates(s):
previous_string = None
return " ".join([i for i in s.split() if i != previous_string])
但我不知道在这种情况下如何或在何处添加 previous_string = i
。
从 Python 3.8 开始你可以使用 assignment expression :=
def remove_consecutive_duplicates(s):
prev = None
return " ".join([prev := i for i in s.split() if i != prev])
它在某些时候可能有点难以理解,但如果您确定要在列表理解中这样做:
def remove_consecutive_duplicates(s):
words = s.split()
return " ".join([words[0]]+[words[i+1] for i in range(len(words)-1) if words[i+1] != words[i]])
test = remove_consecutive_duplicates('alpha beta beta gamma gamma gamma delta alpha beta beta gamma gamma gamma delta')
print(test)
您可以将 itertools 中的 'groupby' 函数与列表理解一起使用,如下所示:
from itertools import groupby
def remove_consecutive_duplicates(s):
return " ".join([word[0] for word in groupby(s.split(" "))])
足够可读。
解决方案
One-line 解决方案:这应该适用于 python 3.6+
[x for x, y in zip(values, values[1:] + [None]) if x!=y]
例子
## Dummy data
s = 'alpha beta beta gamma gamma gamma delta alpha beta beta gamma gamma gamma delta'
# create a list
values = s.split()
## Get required output
[x for x, y in zip(values, values[1:] + [None]) if x!=y]
# ['alpha', 'beta', 'gamma', 'delta', 'alpha', 'beta', 'gamma', 'delta']