我有一个字符串 a="2:1,3:2,4:5,7:5" 我基本上想将其拆分并将 2,3,4,7 分配给一个整数列表和 1,2,5,5进入另一个。我先尝试我们 b=a.split(":") 然后 c=b.split(",")。我只得到 21,32 等。
所以你能建议一种方法来做到这一点吗?
我不知道你怎么可能21
摆脱任何东西,甚至像你所说的那样。
但你在正确的轨道上。让我们一步一步来。
>>> a="2:1,3:2,4:5,7:5"
>>> b=a.split(":")
>>> b
['2', '1,3', '2,4', '5,7', '5']
好的,这是不对的,因为你想先得到2
and 1
,然后是3
and 2
,依此类推。
>>> b=a.split(',')
>>> b
['2:1', '3:2', '4:5', '7:5']
好的,现在我们要对split
其中的每一件事list
。我们如何做到这一点?您可以编写一个for
循环,或使用map
,但列表推导可能是最简单的:
>>> c=[element.split(':') for element in b]
[['2', '1'], ['3', '2'], ['4', '5'], ['7', '5']]
现在你有你的两个列表,但它们被压缩在一起。你如何解压缩它们?通过拉链!
>>> d, e = zip(*c)
>>> d
('2', '3', '4', '7')
>>> e
('1', '2', '5', '5')
现在,您快到了,但您希望这些是整数列表,而不是字符串元组。再次列出推导以进行救援:
>>> f = [int(element) for element in d]
>>> g = [int(element) for element in e]
>>> f
[2, 3, 4, 7]
>>> g
[1, 2, 5, 5]
In [8]: a = "2:1,3:2,4:5,7:5"
In [9]: b, c = zip(*[map(int, t.split(':')) for t in a.split(',')])
In [10]: b
Out[10]: (2, 3, 4, 7)
In [11]: c
Out[11]: (1, 2, 5, 5)
在这里,b
和c
是元组。如果需要,通过调用将它们变成列表list()
。
你可以这样做:
>>> a = "2:1,3:2,4:5,7:5"
>>> l1, l2 = zip(*(map(int, p.split(':')) for p in a.split(',')))
>>> l1
(2, 3, 4, 7)
>>> l2
(1, 2, 5, 5)
a.split(',')
是不言自明的。map(int, p.split(':')) for p in a.split(',')
拆分这些结果对中的每一个,然后将它们转换为整数。
zip(*(...))
获取该生成器并将每对的第一个元素放入一个列表中,将第二个元素放入另一个列表中。
l1, l2 = ...
是元组拆包。它基本上是l1 = ...[0]
and的简写l2 = ...[1]
。
另一种方法是:
>>> l = map(int, a.replace(',', ':').split(':'))
>>> l
[2, 1, 3, 2, 4, 5, 7, 5]
>>> l1, l2 = l[::2], l[1::2]
这会将逗号转换为冒号,然后您可以将其拆分为.split()
. l[::2]
返回每个偶数元素并l[1::2]
返回每个奇数元素。