Как создать новый список для каждого элемента существующего списка (который также генерируется)?

У меня есть список, содержащий некоторые пути:

['folder1/folder2/Module1', 'folder4/folder5/Module2', 'folder7/folder8/Module3', 'folder12/folder13/Module4', 'folder17/folder20/folder50/Module5' .. и т. д.]

Каков наилучший способ извлечь каждый элемент из этого списка и создать новый список или какое-либо другое место для хранения этого пути с его конкретным именем?

Mu текущий код для просмотра каждого элемента списка и сохранения его по одному, но я не могу создать новый список для каждого элемента, не уверен, что это вообще возможно:

for j in range(len(listOfPaths)):
  del pathList[:]
  path = listOfPaths[j]
  pathList.append(path)

Итак, чтобы уточнить, в конце мне нужно получить один список list [Module1], который содержит только «folder1/folder2/Module1», и второй список [Module2] только с путем к Module2 и т. д.


person John    schedule 28.05.2021    source источник
comment
Возможно, было бы полезно немного расширить ваш ответ, указав лучший пример того, как вы хотите, чтобы ваш вывод выглядел. Обычно вы получаете доступ к спискам по индексу (номеру), поэтому что-то вроде list[Module2] будет list[1]. Если вы хотите что-то более конкретное, например list[Module2], вам, вероятно, понадобится диктофон.   -  person tobii    schedule 28.05.2021


Ответы (3)


Здесь лучше использовать словарь, а не список.

#!/usr/bin/env python3
import os

paths = []

paths.append("folder1/subfolderA/Module1")
paths.append("folder2/subfolderB/Module1")
paths.append("folder3/subfolderC/Module1")

paths.append("folder4/subfolderD/Module2")
paths.append("folder5/subfolderE/Module2")

paths.append("folder6/subfolderF/Module50")



# create an empty dictionary
modulesDict = {}
# it will look like this:
#  "ModuleX" -> ["path1/to/ModuleX", "path2/to/ModuleX", ...]
#  "ModuleY" -> ["path3/to/ModuleY", "path4/to/ModuleY", ...]

for path in paths: # loop over original list of paths
    # take only the "ModuleX" part
    moduleName = os.path.basename(os.path.normpath(path))
    # check if its already in our dict or not
    if moduleName in modulesDict:
        # add the path to the list of paths for that module
        modulesDict.get(moduleName).append(path)
    else:
        # create an new list, with only one element (only the path)
        modulesDict[moduleName] = [path]


print(modulesDict)


ВЫВОД: (немного отформатирован)

{
'Module1':
    ['folder1/subfolderA/Module1', 'folder2/subfolderB/Module1', 'folder3/subfolderC/Module1'],
'Module2':
    ['folder4/subfolderD/Module2', 'folder5/subfolderE/Module2'],
'Module50':
    ['folder6/subfolderF/Module50']
}


person tobii    schedule 28.05.2021
comment
Большой! Это мне очень помогло! Спасибо чувак! - person John; 28.05.2021

Проверь это?

temp=['folder1/folder2/Module1', 'folder4/folder5/Module2', 'folder7/folder8/Module3', 'folder12/folder13/Module4', 'folder17/folder20/folder50/Module5']
# List initialization
Output = [] 
  
# Using Iteration to convert 
# element into list of list
for elem in temp:
    temp3=[]
    temp3.append(elem)
    Output.append(temp3)
  
# printing
print(Output)

Выход:

[['folder1/folder2/Module1'], ['folder4/folder5/Module2'], ['folder7/folder8/Module3'], ['folder12/folder13/Module4'], ['folder17/folder20/folder50/Module5']]
person Sujay    schedule 28.05.2021
comment
да, но это означает, что вы получите новый список со всеми элементами, которые содержит temp, так что в основном вы снова получите temp :) - person John; 28.05.2021
comment
Мне нужно получить один список list [Module1], который содержит только «folder1/folder2/Module1», и второй список [Module2] только с путем к Module2 и т. д. - person John; 28.05.2021
comment
Итак, вам нужно разбить один список на несколько списков - person Sujay; 28.05.2021
comment
Да что-то подобное - person John; 28.05.2021

Я думаю, вы можете попробовать это:

ввод=[стра, стрб]

вывод = список (карта (лямбда x: [x], ввод))

person Eyal Gruber    schedule 28.05.2021
comment
Не удалось получить вывод - person John; 28.05.2021
comment
I в поле ввода было написано заглавными буквами, не могли бы вы повторить попытку сейчас? - person Eyal Gruber; 28.05.2021
comment
Да, у меня получилось с первого раза, спасибо! - person John; 28.05.2021