嗨,我写了一个清单如下:
> l = [[10312, -13.069404602050781], [10313, -28.044403076171875],
> [10314, -32.765602111816406], [10315, -47.353294372558594],
> [10312, -63.069404602050781], [10313, -78.044403076171875],
> [10314, -82.765602111816406], [10315, -97.353294372558594]]
从第3行可以看出,列表的第一项被重复,我试图实现的是,循环一达到maxCount,它就不会一直追加到列表的底部,而是追加到右侧。我最想得到的是:
l = [[10312, -13.069404602050781, -63.069404602050781],
[10313, -28.044403076171875, -78.044403076171875],
[10314, -32.765602111816406, -82.765602111816406],
[10315, -47.353294372558594, -97.353294372558594]]
有什么想法吗?你知道吗
我已经想出了一个解决方案,但我觉得有点有限,我现在使用的列表生成器列表,像这样
table=[]
for k in range(0, len(elementContainer):
k = []
table.append(k)
我想给你一个字典生成器,但无法让它工作,任何帮助或如果你有更好的解决方案。你知道吗
如果我没记错的话,这就行了:
是的。你知道吗
编辑
这里有一个更好的算法,因为不再需要指令
l = filter(None,l)
对列表进行过滤,所以转换已经就绪。你知道吗这个指令
l = filter(None,l)
创建了一个新列表,也就是说在内存中的另一个地址创建了一个新对象:那么上面的代码就不能实现列表的就地转换了。下面的一个执行这样的就地转换,因为它通过在处理前后打印列表
l
的标识(id est addresses)而成为证据。你知道吗注意,在前面的代码中,
d
的值是l
的子列表的索引。现在在这个新代码中,
d
的值直接是l
直接引用对象比通过列表中的索引间接引用对象更具python风格。
列表
to_del
记录第一次循环后将被删除的子列表的索引。添加的每个索引都插入到to_del
的开头(不是附加到它的后面),这样第二个循环(for i in to_del
)将在列表l
中逆向运行,这是根据索引删除列表元素时必须遵守的条件。指令
d[subli.pop(0)].extend(subli)
似乎有点难以理解。你知道吗操作从执行
subli.pop(0)
开始:此指令触发从子列表subli
提取索引为0的元素并返回它。然后
d[subli.pop(0)]
提供对象次li.pop(0)到d
作为键,同时此对象从子列表subli
中删除。因此,在这一点上,子列表
subli
已经缩短了它的第一个元素,就好像指令subli[:] = subli[1:]
已经执行了一样参见底部的备注。你知道吗接下来,在通过列表
l
的迭代期间在l
中先前遇到的子列表d[subli.pop(0)]
在该子列表被缩短之后被扩展为子列表subli
中剩余的元素,也就是说,在子列表被缩短之前被索引1
到len(subli)-1
的元素。但是,由于subli
被缩短了,我们只写subli
,而不是subli[1:]
。你知道吗而且有效!结果:
是的。你知道吗
如果希望仅将非冗余元素添加到以前存在的子列表中,则必须:
是的。你知道吗
重要提示
注意区别:
结果
这意味着
A
被就地修改,而N
引用的对象却没有被修改:指令N[1:]
在内存中某个位置构建了一个新对象,而不是N
引用的对象的位置。你知道吗相关问题 更多 >
编程相关推荐