-3

我有一个字符串 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 等。

所以你能建议一种方法来做到这一点吗?

4

3 回答 3

3

我不知道你怎么可能21摆脱任何东西,甚至像你所说的那样。

但你在正确的轨道上。让我们一步一步来。

>>> a="2:1,3:2,4:5,7:5"
>>> b=a.split(":")
>>> b
['2', '1,3', '2,4', '5,7', '5']

好的,这是不对的,因为你想先得到2and 1,然后是3and 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]
于 2013-04-18T18:08:43.627 回答
1
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)

在这里,bc是元组。如果需要,通过调用将它们变成列表list()

于 2013-04-18T18:08:25.807 回答
0

你可以这样做:

>>> 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]返回每个奇数元素。

于 2013-04-18T18:08:36.000 回答