Отдельные элементы, разделенные запятой в списке - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть список строк, который содержит элементы типа

List=['name1,vol', 'name1,price','name2, vol', 'name2,price'.... ] 

Я хотел бы извлечь список только "имен", которые являются частями, которые фактически изменяются как вторые компоненты в каждом элементе иметь фиксированный шаблон (здесь: объем, цена). Обратите внимание, что «имена» могут иметь разную длину. Подводя итог, я хотел бы извлечь что-то вроде:

List_names=['name1', 'name2' ] 

Как я могу это сделать?

Что если у меня что-то типа:

List_tricky=[('name1', 'vol'), ('name1', 'price'),('name2', 'vol'), ('name2', 'price').... ] 

Ответы [ 7 ]

2 голосов
/ 03 февраля 2020

Как-то так?

List=['name1,vol', 'name1,price','name2, vol', 'name2,price']

names = []

for string in List:

    name = string.split(',')[0]

    names.append(name)

print(names)

Для вашего «хитрого» случая вы можете попробовать:

# initialize variables:
names = []

# iterate over each point (tuple):
for point in List:

    # get name:
    name = point[0]

    # append to list:
    names.append(name)

print(names)
1 голос
/ 04 февраля 2020

Чтобы добавить поверх уже замечательного ответа @Alireza Tajadod, вы можете захотеть применить преобразование к набору, а затем вернуться к списку, чтобы удалить любые возможные элементы дублирования, как предложено @ Cryptoharf84 в комментариях.

names_list = list(set([entry.split(',')[0] for entry in List]))

Те же логики c со списком могут быть применены к более сложному случаю.

names_list_2 = list(set([entry[0] for entry in List_tricky]))

Чтобы сделать понимание списка более явным, вы также можете сделать следующее:

names_list_3 = list(set([name for name, _ in List_tricky]))

_ означает, что мы отбрасываем второе значение распакованного кортежа.

Наборы полезны, потому что преобразование списка с дублирующимися элементами в набор эффективно удаляет любые дубликаты.

1 голос
/ 04 февраля 2020

Вы можете превратить его в диктовку, а затем обратно в список, используя str.split. (Не требуется l oop, поскольку он делает это для вас эффективно). Используйте functools.partial, чтобы применить разбиение к каждой строке вместо лямбды:

from functools import partial
list(dict(map(partial(str.split, sep=','), List)))

Это работает для любого ввода, но не более простой для списка кортежей:

>>> l = ['name1,vol', 'name1,price','name2, vol', 'name2,price'.... ]
>>> list(dict(map(partial(str.split, sep=','), List)))
['name1', 'name2']

>>> l = [('name1', 'vol'), ('name1', 'price'),('name2', 'vol'), ('name2', 'price').... ] 
>>> list(dict(l))
['name1', 'name2']
1 голос
/ 03 февраля 2020

Аналогичные логики c ответу @Daniel Sokol, вы можете использовать один вкладыш:

list2 = [x.split(',')[0] for x in List]
0 голосов
/ 03 февраля 2020

Вы также можете использовать функцию .map():

# Case 1: List
all_names = map(lambda x :a.split(',')[0], List)

# Case 2: List_tricky
all_names = [i[0] for i in List_tricky]

# After the code is the same
unique_names = set(all_names)
List_names = list(unique_names)
print(List_names)
0 голосов
/ 03 февраля 2020

Я изменю вашу структуру данных на dict вместо list

d={'name1': ('vol', 'price'),'name2': ('vol', 'price'), .... }

Чтобы получить только имена: d.keys()

0 голосов
/ 03 февраля 2020

В качестве подсказки поищите соглашения об именах в python. Но никогда не называйте переменные, начинающиеся с верхнего регистра, ни с существующих имен классов.

Я попробую что-то вроде:

list_names = [s.split(',')[0].strip() for s in List]
list_unique_names(set(list_names))

split возвращает список «кусков» исходной строки, и полоса для удаления пробелов в начале / конце результирующей строки.

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