<p>编辑:这是基于最初的问题,假设数据将在一个列表中,而不是多个输入列表中。对问题的编辑已经清楚地表明不是这样,所以我建议您遵循<a href="https://stackoverflow.com/a/10691255/722121">Janne Karila's solution</a>。在</p>
<p>假设您知道有多少个不同的值,这是一个很好的解决方案,使用<code>itertools</code>'<a href="http://docs.python.org/library/itertools.html#recipes" rel="nofollow noreferrer">^{<cd2>} recipe</a>:</p>
<pre><code>import itertools
def grouper(n, iterable, fillvalue=None):
args = [iter(iterable)] * n
return itertools.zip_longest(fillvalue=fillvalue, *args)
data = ["date", "1a", "2a", "3a", "1b", "2b", "3b", "1c", "2c", "3c"]
first = data.pop(0)
print([list(zip(itertools.repeat(first), items)) for items in zip(*grouper(3, data))])
</code></pre>
<p>给我们:</p>
^{pr2}$
<p>请注意,如果没有足够的值,这将用<code>None</code>s填充列表。在</p>
<p>{a3}如果你不想显示,就自然地使用。E、 g组:</p>
<pre><code>(zip(itertools.repeat(first), items) for items in zip(*grouper(3, data)))
</code></pre>
<p>请注意,我使用的是python3.x,因此在2.x下,无论我在哪里使用<code>zip()</code>,您可能想要<code>itertools.izip()</code>,而{<cd6>}变成{<cd7>}。在</p>
<p>请注意,更好的方法是假设您知道<em>定义的</em>值应该在第一个列表中,什么应该在第二个列表中,等等。。。在</p>
<pre><code>import itertools
import operator
data = ["date", "1a", "2a", "3a", "1b", "2b", "3b", "1c", "2c", "3c"]
first = data.pop(0)
print([list(zip(itertools.repeat(first), items)) for _, items in itertools.groupby(sorted(data), operator.itemgetter(0))])
</code></pre>
<p>产生:</p>
^{pr2}$
<p>当然,这只适用于给定的示例,假设您的实际数据不同,您将希望将<code>operator.itemgetter(0)</code>更改为一个函数,该函数定义您的项应分组到哪个列表中。在</p>
<p>请注意,我们可能需要封装前缀工作:</p>
<pre><code>def prefix(iterable, prefix):
"""Returns every element of an iterable prefixed with a given value."""
#prefix("ABCDEFG", "x") --> ("x", "A"), ("x", "B"), ("x", "C"), ("x", "D"), ...
return zip(itertools.repeat(prefix), iterable)
</code></pre>
<p>我们只需:</p>
<pre><code>(prefix(items, first) for items in zip(*grouper(3, data)))
</code></pre>
<p>以及</p>
<pre><code>(prefix(items, first) for _, items in itertools.groupby(sorted(data), operator.itemgetter(0)))
</code></pre>
<p>更具可读性。在</p>