2013-03-18 44 views
0

我有一串键值对,不幸的是它们被相同的符号分开。有没有办法“将其”分解成元组列表,而不使用lambda?将字符串拆分为元组列表?

这里是我有:

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

我想要什么:

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

我已经尝试编写一个函数,它将字符串分隔符分开,然后遍历它并生成元组中的两个下一个元素。 – Ibolit 2013-03-18 15:31:01

+3

@Ibolit你可以**显示**你在你的问题中尝试过什么? – Neal 2013-03-18 15:31:21

回答

6
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)) 

输出是[('Moscow', 'city'), ('London', 'city'), ('Royston Vasey', 'vilage')]

10

这是一个非常简单的一个真的...

首先,拆分字符串上'|'然后zip每隔一个元素在一起:

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

在python3,你将需要:print(list(zip(data[::2],data[1::2]))

7
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 2013-03-18 15:32:56

+0

@DSM好的,谢谢。而且''next(it)''更清晰。但是,什么意思是f嘴兼容?相对于传给Python 3? – eyquem 2013-03-18 15:36:09

+1

@eyquem,yes'.next'成为'.__ next__',符合其他方法,如'__str__'和'__len__'等。 – 2013-03-18 15:37:14

4

对于Python2

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

Python3只需当然list(zip(...))

+0

聪明,如果微妙。(+1) – NPE 2013-03-18 15:33:29

+0

@NPE - 这个在itertools文档中的某个地方非常直接,但它最终有时会很有用 – mgilson 2013-03-18 15:34:31

+0

I + 1,但是这个解决方案仅在3/4时才让我满意,因为在创建之后's.split('|')''创建列表并创建迭代器'iter(s.split('|'))'',创建了重复的同一个迭代器的另一个列表,然后它需要一个额外的解压到zip的动态参数 – eyquem 2013-03-18 16:02:52

1

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

+0

@Ibolit你应该知道,如果有N个元组要提取字符串,这个解决方案创建了名为“remaining”的N-1个字符串,没有真正的理由,因为有没有这个的其他方式。 – eyquem 2013-03-18 16:12:16