如何在python类列表中高效地生成编号列表

如何在python类列表中高效地生成编号列表,python,processing-efficiency,coding-efficiency,Python,Processing Efficiency,Coding Efficiency,如何使下面的代码更加紧凑和高效 在这里,代码用于查找列表中某个数值所在的位置。 例如,给定的一组数字 ListNo = [[100,2,5], [50,10], 4, 1, [6,6,500]] 值100、50和500分别位于0、3和9的位置 测试代码如下 ListNo = [[100,2,5], [50,10], 4, 1, [6,6,500]] NumberedList = ListNo Const = 0 items = 0 for i, item in enumerate(ListN

如何使下面的代码更加紧凑和高效

在这里,代码用于查找列表中某个数值所在的位置。 例如,给定的一组数字

ListNo = [[100,2,5], [50,10], 4, 1, [6,6,500]]
值100、50和500分别位于0、3和9的位置

测试代码如下

ListNo = [[100,2,5], [50,10], 4, 1, [6,6,500]]
NumberedList = ListNo
Const = 0
items = 0

for i, item in enumerate(ListNo):
    MaxRange = len(item) if isinstance(item, list) else 1

    for x in range(0, MaxRange):
        if MaxRange > 1:
            NumberedList[i][x] = Const
        else:
            NumberedList[i] = Const
        Const = Const + 1

print(NumberedList)
[0,1,2]、[3,4]、5,6、[7,8,9]]


我的问题是,是否有其他选项可以使此代码更加紧凑和高效。

您可以使用
itertools.count

from itertools import count
i = count()
print([[next(i) for _ in range(len(l))] if isinstance(l, list) else next(i) for l in ListNo])
这将产生:

[[0, 1, 2], [3, 4], 5, 6, [7, 8, 9]]

您可以使用
itertools.count

from itertools import count
i = count()
print([[next(i) for _ in range(len(l))] if isinstance(l, list) else next(i) for l in ListNo])
这将产生:

[[0, 1, 2], [3, 4], 5, 6, [7, 8, 9]]

递归解决方案将更加优雅,可以处理更多的情况:

def nested_list_ordinal_recurse(l, it):
    if isinstance(l, list):
        return [nested_list_ordinal_recurse(item, it) for item in l]
    else:
        return next(it)

def nested_list_ordinal(l, _it=None):
    return nested_list_ordinal_recurse(l, itertools.count())

递归解决方案将更加优雅,可以处理更多的情况:

def nested_list_ordinal_recurse(l, it):
    if isinstance(l, list):
        return [nested_list_ordinal_recurse(item, it) for item in l]
    else:
        return next(it)

def nested_list_ordinal(l, _it=None):
    return nested_list_ordinal_recurse(l, itertools.count())
没有iter工具


如果没有iter工具,

无法运行
ListNo=[1,[2],3]
我不明白你的意思,我可以在我身边运行代码,但没有问题你到底想做什么?在列表中找到某个项目的索引?@Rodneyperusbalandong:它输出
[0,1,2]
,但是如果输出
[0,1,2]
失败,原因是
ListNo=[1,2,3]
我不明白你的意思,我可以在没有问题的情况下在我身边运行代码。你到底想做什么?在列表中找到某项的索引?@Rodneyperusbalandong:它输出
[0,1,2]
,但应该输出
[0,1,2]
谢谢,这看起来更优雅只是好奇,为什么需要i=count(),而不是i=0?这是为了利用
itertools.count()
返回的迭代器,以便
下一步(i)时
,则返回序列中的下一个数字。有关详细信息,请参阅
itertools.count()
。谢谢,这看起来更优雅。只是好奇,为什么需要i=count(),而不是i=0?这是为了利用
itertools.count()
返回的迭代器,以便在调用
next(i)
时,返回序列中的下一个数字。有关详细信息,请参阅
itertools.count()。你的有点可读性。美好的哈哈,也找到了同样的解决办法。你的有点可读性。美好的