如何在线性时间内根据键重新组合列表列表?

Posted

技术标签:

【中文标题】如何在线性时间内根据键重新组合列表列表?【英文标题】:How to regroup a list of list based on keys in linear time? 【发布时间】:2019-01-17 19:08:59 【问题描述】:

您好,我是 Python 新手,我有一个列表列表

arr=[['act', 'abd'], ['cat', 'act'], ['tac', 'act'], ['bad', 'act'], ['fad' , 'adf']]

我想使用 arr[index][1](在本例中是它的 'act'、'abd' 和 'adf')作为重新组合我的列表列表以在 O(N) 中变成这样的关键N是输入列表的时间:

arr=[['act','act','cat','tac'],['abd','bad'],['adf','fad']]

这是我尝试过的,但输出没有意义:

def groupList(a_list):
index=0
searchList=[]
while index<len(tempList)-1:
    key=tempList[index][1]
    newList=[]
    newList.append(key)
    newList.append(tempList[index][0])
    if tempList[index+1][1]==key:
        newList.append(tempList[index+1][0])
    else:
        searchList.append(newList)
    index+=1
print(searchList)

输出是:

[['abd', 'act'], ['act', 'bad']]

任何帮助将不胜感激,谢谢

【问题讨论】:

为什么不是预期的输出 arr=[['act','act','act','act','cat','tac'],['abd','bad'],['adf','fad']] ?是不是因为第一个act也指向act @NickParsons 没错,我认为结构是[key, value1, value2, ...]。确认将不胜感激。 是的,它应该是键、值、值等。但不知何故它没有正确附加? @SookLim 您的代码看起来很乱而且不完整。 tempList 甚至没有定义。所以,是的,你可能在某个地方搞砸了,但很难说是在哪里。您在下面有 2 个更好的解决方案。试着理解他们。两者都在 O(n²)。 【参考方案1】:

您可以使用itertools.groupby 将列表中的列表分组

>>> from itertools import groupby
>>> f = lambda l: l[-1]
>>> [[k]+[l[0] for l in v] for k,v in groupby(sorted(arr, key=f), f)]
[['abd', 'bad'], ['act', 'act', 'cat', 'tac'], ['adf', 'fad']]

【讨论】:

【参考方案2】:

比你的代码简单,我有这个:

arr= [['act', 'act'], ['cat', 'act'], ['tac', 'act'], ['bad', 'abd'],['fad', 'adf']] 

new_arr = []
keys = []

for elt in arr:
    if elt[1] not in keys:
        # apparently you want the key first
        new_arr.append([elt[1], elt[0]])
        keys.append(elt[1])
    else:
        id = keys.index(elt[1])
        new_arr[id].append(elt[0])

它只是查看键是否已经遇到,如果是,它会寻找放置新元素的位置。

输出:

new_arr
Out: [['act', 'act', 'cat', 'tac'], ['abd', 'bad'], ['adf', 'fad']]

但是,这不是 O(n),因为 .index() 方法和 in。是 O(n²)。

注意:我怀疑这可以在 O(n) 中完成,因为您需要一个 for 循环来循环输入,并且对于每个元素,您需要查看它是否需要放置在新的子列表中或现有的。

【讨论】:

以上是关于如何在线性时间内根据键重新组合列表列表?的主要内容,如果未能解决你的问题,请参考以下文章

Python列表是单链表还是双链表?

设置可见性时 XML 列表视图重叠元素

根据组合框选择切换表单上其他字段的可见性 - MS Access

将两个项目限制在线性布局内的顶部和底部

Django模板:如何通过每个字典的嵌套属性重新组合字典列表?

如何根据不同的 API 键重新加载条带元素?