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' |
如您所见,字符串不正常,用符号和空格代替逗号。符号表示名称的数量,我必须计算每个名称后面的一些数据。所以我用
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)]] |
逐步解释
我们把学生(我们叫他们)分开,因为我们需要存储他们的"标记"(或者这些
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
号
把它和学生的子字符串传递给
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']] |
。
进一步阅读
map 内置文档。re 模块文档。