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

时间:2018-05-02 21:46:54

标签: python list

我是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']

但从那时起,我不知道如何进行所需的输出。

有人可以向我解释怎么做吗?

3 个答案:

答案 0 :(得分:0)

itertools.groupby()的典型用例:

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'

答案 1 :(得分:0)

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

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']]

答案 2 :(得分:0)

这是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']