【问题标题】:String Grouping in PythonPython中的字符串分组
【发布时间】:2017-06-16 03:35:32
【问题描述】:

我正在处理Cryptopals Challenge #6

如果字符串是 '11111222223333344444' 并且我想要 5 个一组,我该如何分组和比较这些对。

例如,我想对“11111”和“22222”、“33333”和“44444”进行分组和比较。怎么可能做到这一点?

我使用了这段代码,并在 4 之后不断收到额外的行...

>>> for i in range(0, int(len(string)/size)):
...     print(string[previous : previous + size])
...     print(string[previous + size : previous + size * 2])
...     previous += size * 2

11111
22222
33333
44444

还有什么其他方法可以做到这一点?

【问题讨论】:

  • 比较?你的意思是?他们是不同的。你的意思是你可以有10次1
  • 比较,一般来说,但具体到这个项目,我需要取字符串的平均汉明距离。所以我需要取第一个和第二个字符串,第三个和四个字符串的汉明距离,等等,然后计算平均值。

标签: python python-3.x loops for-loop grouping


【解决方案1】:
def grouper(i, group_size):
    start = 0
    end = group_size
    while start < len(i):
        yield i[start:end]
        start = end
        end += group_size

groups = [i for i in grouper('11111222223333344444', 5)]

print(groups)
['11111', '22222', '33333', '44444']

【讨论】:

  • 这里有很多无关的副本while len(i[start:]): yield seq[start:start + group_size]; start += group_size 消除了跟踪单独的end 变量的需要。
【解决方案2】:

有几种方法可以做到这一点。一个经典的实现是通过列表理解:

chunks = [string[i:i + 5] for i in range(0, len(string), 5)]

使用 itertools.zip_longest 是我的偏好:

def chunk(seq, size):
    for ch in itertools.zip_longest(*([iter(seq)] * size)):
        if None in ch:
            ch = ch[:ch.index(None)]
        yield ''.join(ch)

【讨论】:

    【解决方案3】:

    您可以使用zip 成语here 将元素分组到已知大小的组中。

    s='11111222223333344444'
    for i in zip(*[iter(s)]*5):
        print(i)
    

    输出:

    ('1', '1', '1', '1', '1')
    ('2', '2', '2', '2', '2')
    ('3', '3', '3', '3', '3')
    ('4', '4', '4', '4', '4')
    

    如果您希望它们作为单个字符串,您可以使用''.join

    for i in zip(*[iter(s)]*5):
        print(''.join(i))
    

    输出:

    11111
    22222
    33333
    44444
    

    【讨论】:

    • 我将如何使用解码的 base 64 字符串来执行此操作。例如,base64.b64decode(string)@PatrickHaugh
    猜你喜欢
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2018-01-04
    相关资源
    最近更新 更多