1

有这样的结构

hapts = [('1|2', '1|2'), ('3|4', '3|4')]

我需要zip它(有点......)来获得以下信息:

end = ['1|1', '2|2', '3|3', '4|4']

我开始使用以下代码:

zipped=[] 
for i in hapts:    
    tete = zip(i[0][0], i[1][0]) 
    zipped.extend(tete)
    some = zip(i[0][2], i[1][2])
    zipped.extend(some)        

...并像这样压缩它:

zipped = [('1', '1'), ('2', '2'), ('3', '3'), ('4', '4')]

关于如何继续的任何建议?此外,我确信应该有一种更优雅的方式来做到这一点,但很难将问题的准确定义传递给谷歌;)谢谢!

4

4 回答 4

3

你已经非常接近解决这个问题了,我认为这里最好的解决方案是一个简单str.join()列表理解

["|".join(values) for values in zipped]

这还有一个好处是可以很好地处理(可能)更多的值,而无需修改。

如果您想要元组(这不是您请求的输出显示的内容,因为括号不构成元组,逗号可以),那么添加它是微不足道的:

[("|".join(values), ) for values in zipped]

另请注意,zipped也可以更有效地产生:

>>> zipped = itertools.chain.from_iterable(zip(*[part.split("|") for part in group]) for group in hapts)
>>> ["|".join(values) for values in zipped]
['1|1', '2|2', '3|3', '4|4']

并展示我之前关于优雅地处理更多值的意思:

>>> hapts = [('1|2|3', '1|2|3', '1|2|3'), ('3|4|5', '3|4|5', '3|4|5')]
>>> zipped = itertools.chain.from_iterable(zip(*[part.split("|") for part in group]) for group in hapts)
>>> ["|".join(values) for values in zipped]
['1|1|1', '2|2|2', '3|3|3', '3|3|3', '4|4|4', '5|5|5']
于 2013-01-18T14:52:42.060 回答
1

在这种情况下的问题是

  • 展开列表
  • 重新格式化它
  • 折起来

这是您解决问题的方法

>>> reformat = lambda t: map('|'.join,  izip(*(e.split("|") for e in  t)))
>>> list(chain(*(reformat(t) for t in hapts)))
['1|1', '2|2', '3|3', '4|4']

在这种情况下,您不需要工作代码

相反,如果您需要处理您的输出,只需重新扫描它并使用“|”加入它

>>> ['{}|{}'.format(*t) for t in zipped]
['1|1', '2|2', '3|3', '4|4']

笔记

括号在您的输出中是多余的

于 2013-01-18T14:55:36.587 回答
0
end = []
for groups in hapts:
    end.extend('|'.join(regrouped) for regrouped in zip([group.split('|') for group in groups]))

这也应该继续适用于 n 长度的 n 长度管道分隔字符组和 n 长度组组,尽管它会将重新分组的值截断为每组字符组中最短的字符组。

于 2013-01-18T14:47:30.550 回答
0

您的代码基本上可以工作,但这是一种更优雅的方法。

首先定义一个转置函数,它接受一个条目hapts并翻转它:

>>> transpose = lambda tup: zip(*(y.split("|") for y in tup))

然后将该函数映射到hapts

>>> map(transpose, hapts)
... [[('1', '1'), ('2', '2')], [('3', '3'), ('4', '4')]]

然后如果你想把它展平成一个列表

>>> y = list(chain.from_iterable(map(transpose, hapts)))
... [('1', '1'), ('2', '2'), ('3', '3'), ('4', '4')]

最后,将它重新加入到字符串中:

>>> map("|".join, y)
... ['1|1', '2|2', '3|3', '4|4']
于 2013-01-18T14:50:14.030 回答