【问题标题】:Slicing a string into a list [duplicate]将字符串切成列表[重复]
【发布时间】:2012-12-15 23:11:26
【问题描述】:

可能重复:
How do you split a list into evenly sized chunks in Python?
What is the most “pythonic” way to iterate over a list in chunks?

假设我有一个字符串

s = '1234567890ABCDEF'

我怎样才能将这个字符串切片(或者也许 split 是正确的术语?)这个字符串由每个包含 2 个字符的字符串组成的列表?

desired_result = ['12', '34', '56', '78', '90', 'AB', 'CD', 'EF']

不确定这是否相关,但我正在解析一串十六进制字符,我需要的最终结果是从上面的列表创建的字节列表(例如,使用int(desired_result[i], 16)

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:
    3>> bytes.fromhex('1234567890ABCDEF')
    b'\x124Vx\x90\xab\xcd\xef'
    

    【讨论】:

    • 我总是忘记 Py 3.x 中的 fromhex - 不错的一个 +1
    • 直到它有一个名字并且它被称为 X-Y :)
    • bytes.fromhex 效果很好!但是有没有办法一次转换 4 个(和 8 个)字符? words.fromhexlong.fromhex 之类的东西?
    • @Praetorian 获取您的字节字符串的结果 - 然后使用 struct.unpack - Ignacio:我为不太好的编辑道歉
    • @Jon:别担心,会发生的。
    【解决方案2】:

    你可以使用binascii:

    >>> from binascii import unhexlify
    >>> unhexlify(s)
    '\x124Vx\x90\xab\xcd\xef'
    

    然后:

    >>> list(_)
    ['\x12', '4', 'V', 'x', '\x90', '\xab', '\xcd', '\xef']
    

    【讨论】:

      【解决方案3】:
      >>> s = '1234567890ABCDEF'
      >>> iter_s = iter(s)
      >>> [a + next(iter_s) for a in iter_s]
      ['12', '34', '56', '78', '90', 'AB', 'CD', 'EF']
      >>>
      

      【讨论】:

      • 或者可能:list(''.join(el) for el in zip(*[iter(s)]*2))
      【解决方案4】:
      >>> s = '1234567890ABCDEF'
      >>> [char0+char1 for (char0, char1) in zip(s[::2], s[1::2])]
      ['12', '34', '56', '78', '90', 'AB', 'CD', 'EF']
      

      但是,正如其他人所指出的,对于将十六进制数转换为字节的更普遍的问题,有更直接的解决方案。 另请注意,总体而言,Robert Kings 的解决方案更高效,因为它基本上具有零内存占用(以不太易读的代码为代价)。

      【讨论】:

        猜你喜欢
        • 2022-01-21
        • 2011-08-17
        • 1970-01-01
        • 2012-10-23
        • 2013-11-04
        • 2015-09-11
        • 2015-01-31
        • 1970-01-01
        • 2018-01-27
        相关资源
        最近更新 更多