微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

所以我写了这个函数,它接受一个字符串并删除连续的重复单词。

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?这有可能吗?

通常如果没有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])
,

解决方案

单行解决方案:这应该适用于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,values[1:] + [None]) if x!=y]
# ['alpha','beta','gamma','delta','alpha','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(" "))])

它足够可读。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。