Python:如何将重复出现的连续数字分组为一种类型?
Python: How do I group recurring consecutive digits of only one type?
我编写这个程序是为了在字符串中找到某些连续重复出现的数字并将它们分组。该字符串仅包含 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']
谁能告诉我比这更好更快的方法,并告诉我哪里出错了?
为什么要输出在同一项object/variable?
方法很简单-
item = list("00011101110100010111010001110000")
output = []
count_zeros = 0
for i in item:
if i == "1":
if count_zeros != 0:
output.append(count_zeros)
output.append("n")
# Set count of zero to 0
count_zeros = 0
elif i == "0":
count_zeros = count_zeros + 1
else:
print("This characher is not handled {}".format(i))
print(output)
您可以使用 itertools.groupby
对同一键的连续项目进行分组。由于在这种情况下您真的只想将 0 分组,而将 1 分开,因此我使用的一个技巧是使用一个关键函数,该函数 returns False
用于 0,增量数字用于 1,以便1 不会组合在一起,因为它们的键始终是唯一的。您可以使用 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]
您可以将 itertools.groupby
与嵌套的 for-loop 一起使用,它决定是使用零的数量还是重复一个:
>>> import itertools as it
>>> item = '00011101110100010111010001110000'
>>> [x for k, g in it.groupby(item) for x in (('n' for _ in g) if k == '1' else [sum(1 for _ in g)])]
[3, 'n', 'n', 'n', 1, 'n', 'n', 'n', 1, 'n', 3, 'n', 1, 'n', 'n', 'n', 1, 'n', 3, 'n', 'n', 'n', 4]
我编写这个程序是为了在字符串中找到某些连续重复出现的数字并将它们分组。该字符串仅包含 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']
谁能告诉我比这更好更快的方法,并告诉我哪里出错了?
为什么要输出在同一项object/variable?
方法很简单-
item = list("00011101110100010111010001110000")
output = []
count_zeros = 0
for i in item:
if i == "1":
if count_zeros != 0:
output.append(count_zeros)
output.append("n")
# Set count of zero to 0
count_zeros = 0
elif i == "0":
count_zeros = count_zeros + 1
else:
print("This characher is not handled {}".format(i))
print(output)
您可以使用 itertools.groupby
对同一键的连续项目进行分组。由于在这种情况下您真的只想将 0 分组,而将 1 分开,因此我使用的一个技巧是使用一个关键函数,该函数 returns False
用于 0,增量数字用于 1,以便1 不会组合在一起,因为它们的键始终是唯一的。您可以使用 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]
您可以将 itertools.groupby
与嵌套的 for-loop 一起使用,它决定是使用零的数量还是重复一个:
>>> import itertools as it
>>> item = '00011101110100010111010001110000'
>>> [x for k, g in it.groupby(item) for x in (('n' for _ in g) if k == '1' else [sum(1 for _ in g)])]
[3, 'n', 'n', 'n', 1, 'n', 'n', 'n', 1, 'n', 3, 'n', 1, 'n', 'n', 'n', 1, 'n', 3, 'n', 'n', 'n', 4]