给定以下字符串列表:
my_list = ['element0 123 321n', 'element1 223 32221n', 'element2 19823 328771n', ... ]
如何将每个条目拆分为元组列表:
[ (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
我们可以首先构建一个识别正整数的正则表达式:
from re import compile
INTEGER_REGEX = compile(r'bd+b')
这里的d
代表数字(所以0
、1
等(,+
代表一个或多个,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')]
请注意,不是单独单词的数字将不匹配。例如,'see you l8er'
中的8
将不匹配,因为它不是一个单词。
您的尝试将迭代字符串的每个字符。您必须根据空白拆分字符串。str.split
完美完成的任务。
numbers.append((x))
也是numbers.append(x)
。对于包含 1 个元素的元组,请在右括号前添加一个逗号。即使这也不能解决它。
现在,该列表似乎包含一个 id(跳过(,然后 2 个整数作为字符串,那么为什么不拆分,删除第一个标记,并转换为整数元组呢?
my_list = ['element0 123 321n', 'element1 223 32221n', 'element2 19823 328771n']
result = [tuple(map(int,x.split()[1:])) for x in my_list]
print(result)
给:
[(123, 321), (223, 32221), (19823, 328771)]