【问题标题】:How can I format a list into a tuple with sub-tuples?如何将列表格式化为带有子元组的元组?
【发布时间】:2014-08-30 07:42:23
【问题描述】:

我只是在理解 python 中的列表和元组时遇到了一些麻烦。 我拥有的是一个列表(?我认为),它需要转换为下面给出的特定格式的元组?
我该怎么做呢?
我有:

['A, B, C, D, e, f, g, h, i', '1, 2, 3, 4, 5, 6, 7, 8, 9',]

如何将其格式化为带有子元组的元组,例如

[
    ('A', 'B', 'C', 'D', ('e', 'f', 'g', 'h', 'i')),
    ('1', '2', '3', '4', ('5', '6', '7', '8', '9')),
    ...
]

【问题讨论】:

  • 您忘记指定将列表中的每个字符串转换为具有嵌套元组的元组的规则。此外,元组中的这些值可能仍然是字符串,但您的输出样本缺少引号。
  • 我修复了 Martijn 提出的后一点。现在由您来审查该更改并将您的问题进一步编辑到explain more clearly your needs
  • @MartijnPieters 我不确定你的确切意思,但每个“列表项”中的 5-9 个元素需要在嵌套元组中
  • @user3728778:它不是列表项;它是字符串。你可以把它变成一个列表,比如用逗号分割字符串。

标签: python list python-2.7 tuples


【解决方案1】:

您可以用逗号分隔列表中的每个项目;在这里,我假设您在逗号后也总是有一个空格:

result = []
for elem in inputlist:
    elems = elem.split(', ')
    elems[4:] = [tuple(elems[4:])]
    result.append(tuple(elems))

需要tuple() 和切片分配才能构建外部元组。此处的elems[4:] 分配将列表的第 5 个直到结束的部分替换为仅包含一个元组的列表。

如果您的字符串包含没有空格的逗号或空格是可变的,您可以使用拆分和剥离策略:

elems = [e.strip() for e in elem.split(',')]

演示:

>>> inputlist = ['A, B, C, D, e, f, g, h, i', '1, 2, 3, 4, 5, 6, 7, 8, 9',]
>>> result = []
>>> for elem in inputlist:
...     elems = elem.split(', ')
...     elems[4:] = [tuple(elems[4:])]
...     result.append(tuple(elems))
... 
>>> result
[('A', 'B', 'C', 'D', ('e', 'f', 'g', 'h', 'i')), ('1', '2', '3', '4', ('5', '6', '7', '8', '9'))]

【讨论】:

    【解决方案2】:

    但每个“列表项”中的 5-9 个元素需要在嵌套元组中

    固定大小?那么呢:

    import re
    
    lst = ['A, B, C, D, e, f, g, h, i', '1, 2, 3, 4, 5, 6, 7, 8, 9',]
    
    def prefix_by_four(lst):
        return tuple(lst[:4]) + (tuple(lst[4:]),)
    #          ^^^^^^^^^^^^^^   ^              ^^
    #   make a tuple with the   note how tuples are nested here:
    #   first 4 items               make a tuple of one element `( ... ,)`
    #                               containing a tuple with the remaining items
    
    result = [ prefix_by_four(re.split(r',\s*',item)) for item in lst ]
    #                                   ^^^^^^
    #                          split on `,` followed by
    #                          zero or more spaces
    
    from pprint import pprint
    pprint(result)
    

    制作:

    [('A', 'B', 'C', 'D', ('e', 'f', 'g', 'h', 'i')),
     ('1', '2', '3', '4', ('5', '6', '7', '8', '9'))]
    

    这里我使用了一个“辅助函数”来进行分组。 lambda expression 是可能的,但我认为可读性较差。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多