繁体   English   中英

一种删除列表中仅一个元素的连续重复项的pythonic方法

[英]A pythonic way to delete successive duplicates of only one element in a list

我知道发布了许多其他类似的问题,但我的不同之处在于他们的答案无法解决。

我有几个可能有多个连续空格的字符列表,我只需要保留一个。 应保留任何其他字符的重复。 我是通过以下方式做到的:

myList = ['o', 'e', 'i', ' ', ' ', ' ', 'l', 'k', ' ', ' ', ' ', ' ', ' ', 'j', 'u']
myList_copy = [myList[0]]

for i in range(1, len(myList):
    if not(myList[i] == ' ' and myList[i-1] == ' '):
        myList_copy.append(myList[i])

这成功地给了我

['o', 'e', 'i', ' ', 'l', 'k', ' ', 'j', 'u', ' ']

我真的不认为这是一个非常好的、快速的方法。

我看过类似这样的帖子(和其他帖子)有类似的问题。 但是,请注意我实际上只需要删除重复的空格。 也许我需要帮助的是使用 groupby 来做到这一点,但这就是新帖子的原因。

提前致谢。

是的,使用groupby是个好主意:

import itertools

myList = ['o', 'e', 'i', ' ', ' ', ' ', 'l', 'k', ' ', ' ', ' ', ' ', ' ', 'j', 'u']
result = [key for key,group in itertools.groupby(myList)])

# ['o', 'e', 'i', ' ', 'l', 'k', ' ', 'j', 'u']

如果你想让另一个元素也重复,你可以使用这个:

myList = ['o', 'e', 'i', 'i' , ' ', ' ', ' ', 'l', 'k', ' ', ' ', ' ', ' ', ' ', 'j', 'u']
result = []
for key,group in itertools.groupby(myList):
    if key != ' ': # ' 'string
        for j in group:
            result.append(j)
    else: result.append(key)
print(result)

另一个简单? 方法:

  1. 加入myList中的每个项目以创建一个字符串
  2. 用空格分割字符串
  3. 加入空格
  4. 将字符串转换为列表
myList = ['o', 'e', 'i', ' ', ' ', ' ', 'l', 'k', ' ', ' ', ' ', ' ', ' ', 'j', 'u']

new = list(' '.join(''.join(myList).split()))
print(new)
['o', 'e', 'i', ' ', 'l', 'k', ' ', 'j', 'u']

这和你的一样,但在一行

myList_copy = [myList[x] for x in range(len(myList)) if not(myList[x] == ' ' and myList[x-1] == ' ')]

使用 numpy 怎么样? 试试这个代码。

import numpy as np
myList = ['o', 'e', 'i', ' ', ' ', ' ', 'l', 'k', ' ', ' ', ' ', ' ', ' ', 'j', 'u']
myList = np.array(myList)
myList = [myList[0]] + list(myList[1:][~((myList[1:] == myList[:-1]) & (myList[1:] == ' '))])
print(myList)

您可以在列表推导中使用 zip 将每个字符与前一个字符进行比较,并排除前面有另一个空格的空格:

myList = [ c for p,c in zip([""]+myList,myList) if (p,c) != (' ',' ') ]

可以在字符串上使用相同的方法

myList = [ c for p,c in zip("."+myString, myString) if (p,c) != (' ',' ') ]

但是如果您有一个字符串并且想要一个字符串为 output,则 split() 可能会更简洁:

myString = " ".join(myString.split())

使用 pandas 系列并改变结果怎么样?

import pandas as pd
serie = pd.Series(['o', 'e', 'i', ' ', ' ', ' ', 'l', 'k', ' ', ' ', ' ', ' ', ' ', 'j', 'u'])
index = ~(serie == serie.shift(1))
serie = serie[index]

暂无
暂无

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

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