如何在线性时间内根据键重新组合列表列表?
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 循环来循环输入,并且对于每个元素,您需要查看它是否需要放置在新的子列表中或现有的。
【讨论】:
以上是关于如何在线性时间内根据键重新组合列表列表?的主要内容,如果未能解决你的问题,请参考以下文章
根据组合框选择切换表单上其他字段的可见性 - MS Access