将列表列表重新格式化为另一个列表列表

时间:2017-02-16 18:53:45

标签: python list

我有一份清单清单:

[['X', 'AX', 'AXG'], ['X', 'XG', 'AXG'], ['X', 'XG', 'XGG'], ['X', 'AX', 'CAX']]

我希望得到

['X', 'AX']

因此,从['AX', 'CAX']['X', 'AX', 'CAX']我想得到{"error"=>"You must provide a valid authenticated access token."} ,其中第一个列表的第二个元素是第二个元素的第一个元素。

有没有可能达到它?

2 个答案:

答案 0 :(得分:0)

只是一个天真的实施..

你可以把它简化为1d对象数组(在我们的例子中是list()),并比较从1st开始到所有下一个元素的对象。

只需选择第一个元素并将其与条件的所有下一个元素匹配,然后选择第二个并将其与下一个元素匹配,依此类推......

这里我们对象的条件是让第一个对象的索引1等于第二个对象的索引1,所以你将像这样实现它 -

l = [['X', 'AX'],['X', 'XG'],['XG', 'AXG'],['AX', 'CAX'],['XG', 'XGG'],['AX', 'AXG']]
l1 = list()
for i in range(len(l)):
    for j in range(i+1, len(l)):
        if l[i][1] == l[j][0]:
            l1.append(l[i]+[l[j][1]])

print "l1 = %r"%l1

Output: l1 = [['X', 'AX', 'CAX'], ['X', 'AX', 'AXG'], ['X', 'XG', 'AXG'], ['X', 'XG', 'XGG']]

答案 1 :(得分:0)

这是我过于复杂的实现,它避免gsutil web set -m index.html gs://elving的方式,我认为这种方法在声称是高级语言时被过度使用,而是滥用range()

reduce()

输出

from functools import reduce
from itertools import takewhile, dropwhile

array = [['X', 'AX'], ['X', 'XG'], ['XG', 'AXG'], ['AX', 'CAX'], ['XG', 'XGG'], ['AX', 'AXG']]

def partition(predicate, array):
    return list(takewhile(predicate, array)), dropwhile(predicate, array)

def reducer(accumulated, update):

    for solution in accumulated:
        if solution[-1] == update[0]:
            accumulated.append(solution + update[1:])

    return accumulated

min_length = len(array[0][0])

heads, tails = partition(lambda x: len(x[0]) == min_length, array)

reduction = reduce(reducer, tails, heads)

max_length = len(reduction[-1])

print(list(dropwhile(lambda x: len(x) != max_length, reduction)))

如果我们将输入更改为:

[['X', 'XG', 'AXG'], ['X', 'AX', 'CAX'], ['X', 'XG', 'XGG'], ['X', 'AX', 'AXG']]

我们得到预期的输出:

array = [['X', 'AX'], ['AX', 'CAX'], ['AX', 'AXG'], ['CAX', 'XYZ'], ['CAX', 'ABC'], ['AXG', 'DEF'], ['AXG', 'MNO']]

但是我怀疑OP的规范中没有正确涵盖输入的几个潜在的异常情况。