将字符串拆分为元组列表?

6

我有一串键值对的字符串,不幸的是它们被同一个符号隔开。是否有一种方法可以"仅仅分割"它成为元组列表,而不使用lambda?

这是我目前的代码:

Moscow|city|London|city|Royston Vasey|vilage

What i want:

[("Moscow","city"), ("London", "city")....] 

我尝试编写一个函数,通过分隔符拆分字符串,然后迭代它并在元组中产生两个相邻的元素。 - Ibolit
3
@Ibolit,您能否展示一下您在问题中尝试过的内容? - Naftali
5个回答

15

这其实很简单...

首先,按照 '|' 进行字符串分割,然后将每隔一个元素zip在一起:

data = s.split('|')
print zip(data[::2],data[1::2])

在Python3中,您需要: print(list(zip(data[::2],data[1::2])))


8
s = 'Moscow|city|London|city|Royston Vasey|vilage'

it = iter(s.split('|'))
print [(x,next(it)) for x in it]

3
出于前向兼容性的考虑,鼓励使用next(it)而不是it.next()可能更好。 - DSM
@DSM 好的,谢谢。此外,“next(it)”更清晰。但是你所说的向前兼容性是什么意思?相对于转到Python 3? - eyquem
1
@eyquem,是的,.next 会变成 .__next__,以便与其他方法(如 __str____len__ 等)保持一致。 - John La Rooy
@gnibbler 好的,谢谢。我在 Python 3 的文档中看到,next() 方法确实已经消失了。只是一个小点:"in line with other methods" 意思是 "和其他方法一样",对吗? - eyquem

7
def group(lst, n):
    for i in range(0, len(lst), n):
        val = lst[i:i+n]
        if len(val) == n:
            yield tuple(val)

a = 'Moscow|city|London|city|Royston Vasey|vilage'
list(group(a.split('|'), 2))

输出结果为 [('莫斯科', '城市'), ('伦敦', '城市'), ('罗伊斯顿瓦西', '村庄')]

7

Python3:

>>> s = "Moscow|city|London|city|Royston Vasey|vilage"
>>> list(zip(*[iter(s.split('|'))]*2))
[('Moscow', 'city'), ('London', 'city'), ('Royston Vasey', 'vilage')]

Python2:

zip(*[iter(s.split('|'))]*2)

@NPE -- 这句话基本上是从 itertools 文档中引用的。但有时候它也很有用。 - mgilson
我对 +1 的解决方案不太满意,因为在使用 s.split('|') 创建列表并创建迭代器 iter(s.split('|')) 后,会再次创建相同迭代器的另一个列表,因此需要额外 unpacking 到 zip 的参数。 - eyquem

1
您可以使用 city, status, remaining = s.split("|", 2) 和一些递归方法 city_split(s) 来实现您想要的效果。

@Ibolit,您应该知道,如果在字符串中有N个元组需要提取,那么这种解决方案会创建N-1个名为“remaining”的字符串,这些字符串没有实际的理由存在,因为还有其他方法可以不用它们。 - eyquem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接