繁体   English   中英

如何在列表理解中的每次迭代中更改变量?

[英]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)

输入: 'alpha beta beta gamma gamma gamma delta alpha beta beta gamma gamma gamma delta'

输出: 'alpha beta gamma delta alpha beta gamma delta'

但我的问题是如何在列表理解中添加previous_string = i it ? 这甚至可能吗?

通常,如果没有任何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 开始,您可以使用赋值表达式:=

def remove_consecutive_duplicates(s):
    prev = None
    return " ".join([prev := i for i in s.split() if i != prev])

解决方案

单行解决方案:这应该适用于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):
    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(" "))])

它的可读性足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM