根据嵌套列表的值将元素附加到列表

时间:2017-06-07 17:02:34

标签: python list

我想根据相同列表的值但在不同的索引上附加嵌套列表的特定索引的值。

所以,基本上,如果我的初始列表如下所示:

a = [(1,2,1,[1,2,3]),(1,2,2,[3,2,4]),(1,2,3,[7,3, 4]),(1,2,3,[11,2,7]),...,(2,1,1,[5,6,3]),(2,1,2,[3, 1,8]),...]

我想首先列出列表a的第3个索引的所有值,它们与列表a中的第1个和第2个索引的值相同。因此,第一个输出将如下所示:

b = [[1,2,3],[3,2,4],[7,3,4],[11,2,7]]

然后,我想在输出上运行一些计算,保存数据并获取与初始列表(列表a)共享第1和第2索引的相同值的另一组数据。

对于初始列表的所有值,应该重复此过程,直到该列表中没有剩余值。

使用以下代码,我获得了第一组数据,但是我遇到了下一组问题:

od = 1

ri = 1

q=0

for i in range(len(a)):

    while q<len(a):

        if a[q][0]==od and a[q][1]==ri:

            b.append(Net_info[q][3])

        q+=1
    ri += 1

od += 1

2 个答案:

答案 0 :(得分:5)

只需使用defaultdict并根据前两个元素附加第三个元素,例如:

from collections import defaultdict

result = defaultdict(list)

for ai in a:
    result[ai[:2]].append(ai[3])

这会生成一个字典,如:

>>> result
defaultdict(<class 'list'>, {(1, 2): [[1, 2, 3], [3, 2, 4], [7, 3, 4], [11, 2, 7]], (2, 1): [[5, 6, 3], [3, 1, 8]]})

这是一个字典,它将元组的前两个元素映射到与索引3相关的元素列表。

现在我们可以单独处理这些列表,例如:

for k,b in result.items():
    print('%s: %s'%(k,b))

这会产生:

>>> for k,b in result.items():
...     print('%s: %s'%(k,b))
... 
(1, 2): [[1, 2, 3], [3, 2, 4], [7, 3, 4], [11, 2, 7]]
(2, 1): [[5, 6, 3], [3, 1, 8]]

此算法将对a执行传递。并且不会查找在a中找不到的前两项元组的配置。

答案 1 :(得分:2)

>>> data = dict()
>>> a = [(1, 2, 1, [1, 2, 3]), (1, 2, 2, [3, 2, 4]), (1, 2, 3, [7, 3, 4]), (1, 2, 3, [11, 2, 7]), (2, 1, 1, [5, 6, 3]), (2, 1, 2, [3, 1, 8])]
>>> for d in a:
...     data.setdefault(d[:2], []).append(d[3])

>>> data
{(1, 2): [[1, 2, 3], [3, 2, 4], [7, 3, 4], [11, 2, 7]], (2, 1): [[5, 6, 3], [3, 1, 8]]}
>>> output = data.values()
[[[5, 6, 3], [3, 1, 8]], [[1, 2, 3], [3, 2, 4], [7, 3, 4], [11, 2, 7]]]

试试这个片段,希望这会有所帮助