给出以下字符串列表:
my_list = ['element0 123 321\n', 'element1 223 32221\n', 'element2 19823 328771\n', ... ]
如何将每个条目拆分为元组列表:
[ (123, 321), (223, 32221), (19823, 328771), ... ]
在我的其他不良尝试中,我设法提取数字,但我遇到了问题,元素占位符还包含此方法包含的数字!它也不会写入tuple
,而是list
。
numbers = list()
for s in my_list:
for x in s:
if x.isdigit():
numbers.append((x))
numbers
答案 0 :(得分:6)
我们可以首先构建一个标识正整数的正则表达式:
from re import compile
INTEGER_REGEX = compile(r'\b\d+\b')
此处\d
代表数字(所以0
,1
等),+
代表一个或多个< / em>,\b
是字边界。
然后我们可以使用INTEGER_REGEX.findall(some_string)
来识别输入中的所有正整数。现在唯一要做的就是遍历列表的元素,并将INTEGER_REGEX.findall(..)
的输出转换为元组。我们可以这样做:
output = [tuple(INTEGER_REGEX.findall(l)) for l in my_list]
对于您的给定样本数据,这将产生:
>>> [tuple(INTEGER_REGEX.findall(l)) for l in my_list]
[('123', '321'), ('223', '32221'), ('19823', '328771')]
请注意,非单独字词的数字不将匹配。例如,8
中的'see you l8er'
将不会匹配,因为它不是一个单词。
答案 1 :(得分:3)
您的尝试会迭代字符串的每个字符。你必须根据空白拆分字符串。 str.split
完美无缺的任务。
numbers.append((x))
也是numbers.append(x)
。对于1元素的元组,在结束括号之前添加逗号。即使它也没有解决它。
现在,列表似乎包含一个id(跳过),然后是2个整数作为字符串,那么为什么不拆分,删除第一个标记,并转换为整数元组?
my_list = ['element0 123 321\n', 'element1 223 32221\n', 'element2 19823 328771\n']
result = [tuple(map(int,x.split()[1:])) for x in my_list]
print(result)
给出:
[(123, 321), (223, 32221), (19823, 328771)]