Python Zip List Append

时间:2014-05-30 10:40:48

标签: python

编辑:添加了更多信息

如何将新列表附加到已压缩列表中。执行此操作的主要原因是,我需要扫描字典并使用特定字符拆分任何字段,并将结果列表添加到ziplist。

dictionary = {
    'key1': 'testing'
    'key2': 'testing'
    'key3': '6-7-8',
    }
list1 = ['1','2','3']
list2 = ['3','4','5']
ziplist = zip(list1,list2)

for key, value in dictionary.iteritems():
    if '-' in value:
        newlist = value.split('-')
        ziplist.append(newlist)

for a,b,c in ziplist:
    print a,b,c

预期输出

1 3 6
2 4 7
3 5 8

使用上面的代码我收到以下错误。

for a,b,c in ziplist:
ValueError: need more than 2 values to unpack

我认为'新列表'列表没有附加到ziplist。为什么这不起作用?

提前谢谢。

2 个答案:

答案 0 :(得分:5)

您需要实际查看您正在创建的内容:

>>> array1 = ['1','2','3']
>>> array2 = ['3','4','5']
>>> ziplist = zip(array1,array2)
>>> ziplist
[('1', '3'), ('2', '4'), ('3', '5')]

然后

>>> newlist = ['7', '8', '9'] # for example
>>> ziplist.append(newlist)
>>> ziplist
[('1', '3'), ('2', '4'), ('3', '5'), ['7', '8', '9']]
显然,这不是你想要的。假设您无法再访问array1array2,最简单的方法是使用ziplist再次展开zip,然后添加newlist,然后重新zip

>>> flatlist = zip(*ziplist)
>>> flatlist
[('1', '2', '3'), ('3', '4', '5')] # almost back to array1 and array2
>>> flatlist.append(newlist)
>>> ziplist = zip(*flatlist)
>>> ziplist
[('1', '3', '7'), ('2', '4', '8'), ('3', '5', '9')]

或者,由于您不需要在此期间使用压缩列表,因此请始终收集整个列表,并且最后只收集zip

flatlist = [['1','2','3'], ['3','4','5']]

for value in dictionary.itervalues():
    if '-' in value:
        flatlist.append(value.split('-'))

for t in zip(*flatlist):
   print " ".join(map(str, t))

请注意,ziplist中的每个元组中可能没有正好3个项目,因此我删除了该假设。

答案 1 :(得分:2)

如果您不太关心合并列表的内部结构,则可以zip将您的附加列表放在现有列表上。这将包含嵌套元组的项目,如((1, 3), 6),但您可以在迭代时解压缩这些:

for (a, b), c in zip(ziplist, newlist):
    print a, b, c