将元素插入列表中的确切位置,而无需在Python中调整数组大小?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了将元素插入列表中的确切位置,而无需在Python中调整数组大小?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3034字,纯文字阅读大概需要5分钟。
内容图文
![将元素插入列表中的确切位置,而无需在Python中调整数组大小?](/upload/InfoBanner/zyjiaocheng/660/15bf92a6706d4cb5b2a40a1c2caadbfa.jpg)
我已经看过Create an empty list in python with certain size – Stack Overflow;但我只想确认-考虑以下MWE:
data = ( ( "x1", ( (3, "a"), (1, "b"), (5, "c") ) ), ( "x2", ( (2, "a"), (4, "b") ) ) )
outputA = []
for ix in data:
print ix[0] # x1, x2
for isnip in ix[1]:
outputA.append(isnip)
print outputA
# [(3, 'a'), (1, 'b'), (5, 'c'), (2, 'a'), (4, 'b')]
outputB = []
for ix in data:
print ix[0] # x1, x2
for isnip in ix[1]:
outputB.insert(isnip[0], isnip)
print outputB
# [(3, 'a'), (1, 'b'), (2, 'a'), (5, 'c'), (4, 'b')]
outputC = [None] * (5+1) #[]
for ix in data:
print ix[0] # x1, x2
for isnip in ix[1]:
outputC[isnip[0]] = isnip
print outputC
# [None, (1, 'b'), (2, 'a'), (3, 'a'), (4, 'b'), (5, 'c')]
我有2D元组的数据(实际上,在我的实际情况中是dict,但没关系),其第一个元素是排序索引.它们是未分类的,我需要对其进行分类.但是,它们处于所有可能的嵌套级别(为简化示例,我在上面已简化了数据;在我的实际情况下,它们甚至可以嵌套得更多),因此我无法轻松地发出“排序”命令.
因此,我考虑了插入元素-如您所见,我无法获取.insert()来保留顺序.因此,我当时考虑了显式分配-并且可行,但前提是列表的大小事先已确定;要找到大小,我仍然必须进行一次额外的递归,以发现最大索引是多少.
因此,我想在列表的精确位置(而不是像.insert()一样在“之前”)插入列表,但是没有事先明确确定列表的大小-有什么方法可以实现?
编辑:这有点像我的实际数据,显示(希望)为什么将其排序困难:
data = ( ( "x1", ( (3, "a"), (1, "b"), (5, "c") ) ), ( "x2", ( "x3", ( (2, "a"), (4, "b") ) ) ), ("x100", 1 ) )
outputA = []
for ix in data:
#print "[0]", ix[0], "[1]", ix[1] # x1, x2, x100
try:
for isnip in ix[1]:
#print "isnip", isnip[0], "-", isnip[1]
if int(isnip[0]) == isnip[0]:
outputA.append(isnip)
else:
raise Exception("not good")
except:
try:
for isnip in ix[1][1]:
#print "isnip", isnip[0], "-", isnip[1]
if int(isnip[0]) == isnip[0]:
outputA.append(isnip)
except:
#print "skipping this"
pass
print outputA
# [(3, 'a'), (1, 'b'), (5, 'c'), (2, 'a'), (4, 'b')]
outputB = []
for ix in data:
try:
for isnip in ix[1]:
if int(isnip[0]) == isnip[0]:
outputB.insert(isnip[0]+1, isnip)
else:
raise Exception("not good")
except:
try:
for isnip in ix[1][1]:
#print "isnip", isnip[0], "-", isnip[1]
if int(isnip[0]) == isnip[0]:
outputB.insert(isnip[0]+1, isnip)
except:
#print "skipping this"
pass
print outputB
# [(3, 'a'), (1, 'b'), (5, 'c'), (2, 'a'), (4, 'b')]
解决方法:
将您的数据视为一棵树:
data = ( "x", (
( "x1", (
(3, "a"),
(1, "b"),
(5, "c"))),
( "x2", (
(2, "a"),
(4, "b")))))
我添加了一个根节点以使其具有一致的格式.那棵树上的叶子是什么构成的?
def isleaf(x):
return not isinstance(x[1], tuple)
现在,您可以运行一个简单的depth-first search来使叶子处于预定状态:
def dfs(x):
if isleaf(x):
yield x
return
for y in x[1]:
yield from dfs(y)
例:
>>> list(dfs(data))
[(3, 'a'), (1, 'b'), (5, 'c'), (2, 'a'), (4, 'b')]
>>> sorted(dfs(data), key=lambda x: x[0])
[(1, 'b'), (2, 'a'), (3, 'a'), (4, 'b'), (5, 'c')]
可以将其扩展到任何其他树状数据.
更新:如果由于某种原因您绝对必须避免排序步骤,则可以将结果收集到字典中,然后构造数组.
d = {}
def dfs(x):
if isleaf(x):
d[x[0]] = x
return
for y in x[1]:
dfs(y)
dfs(data)
res = [None] * (max(d) + 1)
for i, v in d.items():
res[i] = v
内容总结
以上是互联网集市为您收集整理的将元素插入列表中的确切位置,而无需在Python中调整数组大小?全部内容,希望文章能够帮你解决将元素插入列表中的确切位置,而无需在Python中调整数组大小?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。