Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用zip()旋转列表_Python_List - Fatal编程技术网

Python 使用zip()旋转列表

Python 使用zip()旋转列表,python,list,Python,List,我有一组从数据库返回的记录,格式如下: data = [ ["date", "value1a", "value2a", "value3a", ...], ["date", "value1b", "value2b", "value3b", ...] ] 我想把这组行变成一个列表 [ [("date", "value1a"), ("date", "value1b"), ... ], [("date", "value2a"), ("date", "value2b"),

我有一组从数据库返回的记录,格式如下:

data = [
    ["date", "value1a", "value2a", "value3a", ...],
    ["date", "value1b", "value2b", "value3b", ...]
]
我想把这组行变成一个列表

[
    [("date", "value1a"), ("date", "value1b"), ... ],
    [("date", "value2a"), ("date", "value2b"), ... ]
]

我知道
zip()
会做这类事情,但我不清楚如何将日期输入到每个记录中(并使它们成为元组)。从数据库返回的行的长度并不总是相同的,但我知道每次调用的预期长度。

对第一个元素使用itertools repeat:

zip(itertools.repeat(ls[0]), ls[1:])

编辑:这是基于原始问题,假设数据将在单个列表中,而不是多个输入列表中。对问题的编辑清楚地表明情况并非如此,因此我建议您遵循

假设您知道有多少不同的值,这是一个很好的解决方案,使用
itertools

给了我们:

[
    [('date', '1a'), ('date', '1b'), ('date', '1c')], 
    [('date', '2a'), ('date', '2b'), ('date', '2c')], 
    [('date', '3a'), ('date', '3b'), ('date', '3c')]
]
请注意,如果没有足够的值,这将使用
None
s填充列表

当然,如果只想在其上循环,则可以使用,例如,不显示它。例如:

(zip(itertools.repeat(first), items) for items in zip(*grouper(3, data)))
请注意,我使用的是Python3.x,因此在2.x下,无论我在哪里使用
zip()
,您都可能需要
itertools.izip()
,而
itertools.zip_longest()
变成
itertools.izip_longest()

请注意,更好的方法是——假设您知道什么定义了应该在第一个列表中的值,什么应该在第二个列表中,等等

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))])
产生:

[
    [('date', '1a'), ('date', '1b'), ('date', '1c')], 
    [('date', '2a'), ('date', '2b'), ('date', '2c')], 
    [('date', '3a'), ('date', '3b'), ('date', '3c')]
]
当然,这只适用于给定的示例,假设实际数据不同,您需要将
操作符.itemgetter(0)
更改为定义项目应分组到哪个列表的函数

请注意,我们可能值得封装我们的前缀工作:

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)
然后我们就有了:

(prefix(items, first) for items in zip(*grouper(3, data)))

更具可读性

data = [["date_a", "1a", "2a", "3a"], 
        ["date_b", "1b", "2b", "3b"]]

print zip(*(zip(itertools.repeat(ls[0]), ls[1:]) for ls in data))
给予


有关一些有用的变体,请参见注释。

这也可以通过简单的列表理解技术实现

data = [    ["date1", "value1a1", "value2a1", "value3a1"],
            ["date2", "value1b2", "value2b2", "value3b2"]
       ]
result = map(list, zip(*[[(x[0], x[i]) for x in data] for i in range(1,len(x))]))

[
  [('date1', 'value1a1'), ('date1', 'value2a1'), ('date1', 'value3a1')],
  [('date2', 'value1b2'), ('date2', 'value2b2'), ('date2', 'value3b2')]
]

单独的列表/值来自哪里?在原始列表中,
value1b
位于何处?如示例结果所示,是否只有一个日期?是的,第一列是日期,行的其余部分是需要与日期配对的数据。“value1b在原始列表中位于何处?”-抱歉,这不清楚:这是数据集第二行的相应结果。我会更新这个问题。@Tom将来让你的问题更清楚的是给出你可以传递到Python中的实际值。它使测试代码更容易,并且使您的解释更清晰。例如,在这里,您缺少列表周围的外部列表,并且您的值在Python中不是真实的值(使用字符串而不是假装变量名,使用
..
而不是
等)。
我进行了编辑,以向您展示所需的内容。这不会生成请求的输出。使用
ls=[“date”,“value1a”,“value2a”,“value3a”]
列表(zip(itertools.repeat(ls[0]),ls[1:])
给了我
[('date','value1a'),('date','value2a'),('date','value3a')]
据我所知,这似乎是正确的。@递归询问者希望将所有
1
值分组,而不是将所有
a
值分组。+1。这是更新问题的最佳解决方案。请注意,在2.x下,您最好先使用,以避免计算列表。@Lattyware最好将其作为一个例子请注意,因为当前的答案是交叉兼容的。如果您使用的是Python3,您可以这样做,这在我看来可读性要高得多:
zip(*(zip(itertools.repeat(k),v)for k,*v in data))
data = [["date_a", "1a", "2a", "3a"], 
        ["date_b", "1b", "2b", "3b"]]

print zip(*(zip(itertools.repeat(ls[0]), ls[1:]) for ls in data))
[(('date_a', '1a'), ('date_b', '1b')),
 (('date_a', '2a'), ('date_b', '2b')),
 (('date_a', '3a'), ('date_b', '3b'))]
data = [    ["date1", "value1a1", "value2a1", "value3a1"],
            ["date2", "value1b2", "value2b2", "value3b2"]
       ]
result = map(list, zip(*[[(x[0], x[i]) for x in data] for i in range(1,len(x))]))

[
  [('date1', 'value1a1'), ('date1', 'value2a1'), ('date1', 'value3a1')],
  [('date2', 'value1b2'), ('date2', 'value2b2'), ('date2', 'value3b2')]
]