Python:如何对只有一种类型的重复出现的连续数字进行分组?

标签 python list loops logic list-comprehension

我编写此程序是为了在字符串中查找某些连续重复出现的数字并将它们分组。该字符串仅包含 0 和 1,我想通过将它们转换为数字来缩短重复出现的零。另外,为了避免混淆,我将所有的 1 都转换成了一个字母。例如:

item = list("00011101110100010111010001110000")

for i in item:
    if i == "1":
        item[item.index(i)] = "n"
    if i == "0":
        index = item.index(i)
        zeros = 0
        for shft, _ in enumerate(item):
            try:
                if item[index+shft] == "1":
                    break
                if item[index+shft] == "0":
                    item.pop(index+shft)
                    zeros+=1
            except IndexError:
                pass
        item.insert(index, zeros)
        
print(item)

我写的这个程序的预期输出是

[3, 'n', 'n', 'n', 1, 'n', 'n', 'n', 1, 'n', 3, 'n', 1, 'n', 'n', 'n', 1, 'n', 3, 'n', 4]

但我得到的输出是:

[2, 1, 'n', 'n', 'n', 1, 'n', 'n', 'n', 4, 'n', 1, 'n', 'n', 'n', 'n', 3, 'n', 1, 'n', 'n', 'n', 2, 1, 1]

我四处寻找这种可以对连续字符进行分组的东西,我找到的最接近的东西是 this Java 示例,但我在 python 中实现它时遇到了问题。

然后我尝试了这种方法:

item = img[2]

zeros = 0
for idx, i in enumerate(item):
    if i == "0":
        zeros += 1
        item.pop(idx)
    elif i == "1":
        item[idx] = "n"
        if zeros != 0:
            item.insert(idx-1, zeros)
            zeros = 0
    elif i == "x":
        if zeros != 0:
            item.insert(idx-1, zeros)
            zeros = 0

print(item)

但是输出是:

['0', 2, '1', 'n', 'n', 1, '1', 'n', 'n', '1', '0', '1', 4, '1', 'n', 'n', '1', '0', 3, '1', 'n', 'n', '0', 2, '0', 'x']

谁能告诉我比这更好更快的方法,并告诉我哪里出错了?

最佳答案

您可以使用 itertools.groupby 对同一键的连续项目进行分组。由于在这种情况下您真的只想将 0 分组,而将 1 分开,因此我使用的一个技巧是使用一个关键函数,该函数为 0 返回 False 并为 1 返回一个递增数字,以便 1s不会组合在一起,因为它们的键总是唯一的。您可以使用 itertools.count 生成这样的递增数字:

from itertools import groupby, count

item = '00011101110100010111010001110000'

c = count(1)
print([
    'n' if k else sum(1 for _ in g)
    for k, g in groupby(item, lambda i: i == '1' and next(c))
])

这个输出:

[3, 'n', 'n', 'n', 1, 'n', 'n', 'n', 1, 'n', 3, 'n', 1, 'n', 'n', 'n', 1, 'n', 3, 'n', 'n', 'n', 4]

关于Python:如何对只有一种类型的重复出现的连续数字进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72443381/

相关文章:

python - numpy从上到下排序

python - 在 python 中将列表附加到列表时出现问题

python - 检查字符串是否包含 Python 列表中的元素时出错?

string - 在go中遍历字符串字符的最正确方法是什么

javascript - 循环 JavaScript

c - 通过中断或类似方式异步退出循环 (MSP430/C)

python - 如何根据Python中行值的条件应用列中的值

python - 使用类字典映射到 Python 中的实例方法

mysql - R:ifelse 中的字符串列表

python - 如何在 Python 中将 dos 路径拆分为其组件