创建具有重复列表元素的子列表

2024-06-09 15:06:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,正在尝试为共享相同基的列表元素创建子列表:

listRaw = ['AKS/STB', 'SBHS/AME', 'SBJ/OAK', 'SBJ/ALS', 'AKS/OSMX', 'SBHS/ABNX', 'AKS/AKX']
desiredOutput = [['AKS/STB', 'AKS/OSMX', 'AKS/AKX'], ['SBHS/AME', 'SBHS/ABNX'], ['SBJ/OAK', 'SBJ/ALS']]

我尝试首先使用以下方法将基元素与每个列表元素隔离:

def commonNumerator(self):
    checkPosition = self.find('/')
    commonNumerator = self[:checkPosition]
    return commonNumerator

listRawModified = [commonNumerator(x) for x in listRaw]
print(listRawModified)

这让我明白:

['AKS', 'SBHS', 'SBJ', 'SBJ', 'AKS', 'SBHS', 'AKS']

但从那时起,我不知道如何继续得到想要的输出

有人能告诉我怎么做吗


Tags: self元素列表aksalsstboakame
3条回答

另一种方法是拆分每个元素并创建一个字典,然后从该字典构造所需的输出,例如:

In []:
d = {}
for i in listRaw:
    k, v = i.split('/')
    d.setdefault(k, []).append(v)
[['/'.join([k, v]) for v in d[k]] for k in d]

Out[]:
[['AKS/STB', 'AKS/OSMX', 'AKS/AKX'], ['SBHS/AME', 'SBHS/ABNX'], ['SBJ/OAK', 'SBJ/ALS']]

这是itertools的典型用例。但您也可以考虑将这些值存储在字典中:

from collections import defaultdict

d = defaultdict(list)
listRaw = ['AKS/STB', 'SBHS/AME', 'SBJ/OAK', 'SBJ/ALS', 'AKS/OSMX', 'SBHS/ABNX', 'AKS/AKX']

for item in listRaw:
    i,y = item.split('/')
    d[i].append(y)

print(dict(d))

# {'AKS': ['STB', 'OSMX', 'AKX'], 'SBHS': ['AME', 'ABNX'], 'SBJ': ['OAK', 'ALS']}

然后可以使用如下简单命令访问AKS的值:

d['AKS'] # ['STB', 'OSMX', 'AKX']

^{}的典型用例:

from itertools import groupby

listRaw = ['AKS/STB', 'SBHS/AME', 'SBJ/OAK', 'SBJ/ALS', 'AKS/OSMX', 'SBHS/ABNX', 'AKS/AKX']

def key(s):
    return s.split('/')[0]

[list(g) for k, g in groupby(sorted(listRaw, key=key), key=key)]
# [['AKS/STB', 'AKS/OSMX', 'AKS/AKX'], ['SBHS/AME', 'SBHS/ABNX'], ['SBJ/OAK', 'SBJ/ALS']]

key()函数有助于提取排序/分组键:key('AKS/STB')=='AKS'

相关问题 更多 >