Переупорядочить / реструктурировать список строк на основе значения части строки - PullRequest
0 голосов
/ 02 октября 2019

У меня есть список файлов .csv, которые я пытаюсь переставить определенным образом. Допустим, мой первоначальный список выглядит следующим образом:

["Component 1 - Cable 1.csv", "Component 1 - Cable 2.csv", "Component 2 - Cable 1.csv", "Component 3 -Cable 1.csv"]

Я бы хотел, чтобы список выглядел так, но не могу понять, как его достичь:

[["Component 1 - Cable 1.csv", "Component 1 - Cable 2.csv"], ["Component 2 - Cable 1.csv"], ["Component 3 - Cable 1.csv"]]

Ответы [ 3 ]

2 голосов
/ 02 октября 2019

Использование itertools.groupby:

from itertools import groupby

res = []
for _, g in groupby(l, key=lambda x:x.split('-')[0]):
    res.append(list(g))

Или однострочное:

res = [list(g) for _, g in groupby(l, key=lambda x:x.split('-')[0])]

Вывод обоих:

[['Component 1 - Cable 1.csv', 'Component 1 - Cable 2.csv'],
 ['Component 2 - Cable 1.csv'],
 ['Component 3 -Cable 1.csv']]
0 голосов
/ 02 октября 2019

В качестве альтернативы itertools.groupby вы можете использовать словарь, который может быть проще для новичков, следующим образом.

l = ["Component 1 - Cable 1.csv", "Component 1 - Cable 2.csv", "Component 2 - Cable 1.csv", "Component 3 -Cable 1.csv"]

# Option 1: Use of dictionary
newdata = {}
for x in l:
  group =  x.split('-')[0]
  if group not in newdata:  # Add list to dictionary for missing keys
    newdata[group] = []
  newdata[group].append(x)
print (list(newdata.values()))

# Option 2: Simply by using set default to remove conditional key check
newdata = {}
for x in l:
  group = x.split('-')[0]  # group based upon string before hyphen
  newdata.setdefault(group, []).append(x)  # removes need for conditional by providing a default value for missing keys

print (list(newdata.values()))

# Option 3: Simplify further by using default dict
from collections import defaultdict
newdata = defaultdict(list)         # creates dictionary where missing keys return a empty list
for x in l:
  group = x.split('-')[0]  # group based upon string before hyphen
  newdata[group].append(x)  # accumulate groupings together as value
                                           # in dictionary
print (list(newdata.values()))

Все три параметра выводят

[['Component 1 - Cable 1.csv', 'Component 1 - Cable 2.csv'], ['Component 2 - Cable 1.csv'], ['Component 3 -Cable 1.csv']]
0 голосов
/ 02 октября 2019

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

[['Component 1 - Cable 1.csv'], ['Component 1 - Cable 2.csv'], ['Component 2 - Cable 1.csv'], ['Component 3 -Cable 1.csv']]

, вы можете просто использовать:

l = ["Component 1 - Cable 1.csv", "Component 1 - Cable 2.csv", "Component 2 - Cable 1.csv", "Component 3 -Cable 1.csv"]
l = [[i] for i in l]

Здесь яэто просто некоторая переменная, и вы применяете функцию ко всем элементам в данном списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...