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

时间:2018-07-26 14:43:59

标签: python-3.x tuples

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

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

如您所见,该字符串不正常,带有符号和空格代替逗号。 符号代表名称的数量,我必须为这些名称计算每个名称之后的一些数据。因此,我使用string.split('#')创建了3个单独的字符串,然后从其中使用for循环在第一次迭代中获取该字符串:

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

之所以从列表中缺少“ Jane”,是因为我只需要获取值(无论是字符串还是整数),并从中获取嵌套的元组。因此,我希望将此列表转换为如下所示的嵌套元组:

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

我将不胜感激任何帮助或建议。

2 个答案:

答案 0 :(得分:1)

我不知道是否有更好的方法,但是我们开始:

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)

输出

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

Try it online!

答案 1 :(得分:0)

使用regular expressions

>>> 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)]]

分步说明

  1. 由于我们需要存储学生的“标记”(或这些A / B / {{1}的作用,因此我们将学生彼此分开(我们称其为“他们”) } / CD / +是什么意思?)在不同的容器中:

    -
  2. 我们正在为每位学生使用正则表达式搜索“标记”数据

    string.split('#')
    

    可以读为

      

    任何大写拉丁字母(可以在其后跟[A-Z][+-]? \d+ +符号)和空格后跟数字

    ,并将其和学生的子字符串传递给-函数。之后,我们将得到类似的内容:

    re.findall
  3. 最后,我们可以使用>>> [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 / +的字母与数字分开,并在这对上进行迭代,将第二个坐标转换为-

进一步阅读