将包含整数和字符串的列表转换为嵌套元组Python

Converting a list that contains integers and strings into a nested tuple, Python

本问题已经有最佳答案,请猛点这里访问。

我希望将字符串转换为嵌套元组,例如:

1
string = 'Jane A 3 B- 3 F 1#Bob C+ 2 D+ 3#Chris C 4 C 3 C- 2'

如您所见,字符串不正常,用符号和空格代替逗号。符号表示名称的数量,我必须计算每个名称后面的一些数据。所以我用string.split('#')创建了3个独立的字符串,从中,我使用了for循环在第一次迭代中得到它:

1
['A', 3, 'B-', 3, 'F', 1]

列表中缺少"jane"的原因是,我只需要获取值(无论是字符串还是整数),并从中生成嵌套的元组。因此,我希望将此列表转换为一个嵌套的元组,如下所示:

1
[('A', 3), ('B-', 3), ('F', 1)]

我将非常感谢任何帮助或建议。


我不知道有没有更好的方法,但现在我们开始:

1
2
3
4
5
6
7
8
9
input = ['A', 3, 'B-', 3, 'F', 1]

l1 = input[::2] # get even
l2 = input[1::2] # get odd

tuples = list(zip(l1,l2)) # zip them together
# yes it could be wrote `tuples = list(zip(input[::2],input[1::2]))`

print (tuples)

产量

1
[('A', 3), ('B-', 3), ('F', 1)]

网上试试!


使用正则表达式

1
2
3
4
5
6
7
8
>>> import re
>>> [[(mark, int(count))
      for mark, count in map(str.split,
                             re.findall(r'[A-Z][+-]? \d+', student_data))]
     for student_data in string.split('#')]
[[('A', 3), ('B-', 3), ('F', 1)],
 [('C+', 2), ('D+', 3)],
 [('C', 4), ('C', 3), ('C-', 2)]]

逐步解释

  • 我们把学生(我们叫他们)分开,因为我们需要存储他们的"标记"(或者这些A/B/C/D+/-是什么意思?)在不同的容器中:

    1
    string.split('#')

  • 对于每个学生,我们使用正则表达式搜索"标记"数据

    1
    [A-Z][+-]? \d+

    读起来像

    any capital Latin letter (which optionally may be followed by + or - sign) and a whitespace followed by digits

    把它和学生的子字符串传递给re.findall函数。在那之后,我们会有如下的东西:

    1
    2
    >>> [re.findall(r'[A-Z][+-]? \d', student_data) for student_data in string.split('#')]
    [['A 3', 'B- 3', 'F 1'], ['C+ 2', 'D+ 3'], ['C 4', 'C 3', 'C- 2']]

  • 最后,我们可以使用str.split方法将带有+/-的字母从数字中分离出来,并在这个对上迭代,将第二个坐标转换为int
  • 进一步阅读

    • map内置文档。
    • re模块文档。