#python #pandas #dataframe #numpy #data-manipulation
Вопрос:
Как разделить элементы в этом элементе на основе строки перед точкой, не записывая ее явно в коде?
lst = ['ds_a.cola','ds_a.colb','ds_b.cola','ds_b.colb']
Так как существует два варианта «ds». Мне нужны два списка.
lst_dsa = ['ds_a.cola','ds_a.colb']
lst_dsb = ['ds_b.cola','ds_b.colb']
Мой старый код был:
lst_dsa = []
lst_dsb = []
for item in lst :
if "ds_a" in item:
lst_dsa.append(item)
else:
lst_dsb.append(item)
Но я не могу использовать это, так как может быть больше 2, например,ds_c, ds_d….
Как мне добиться этого в python?
Комментарии:
1. Всегда ли группы являются смежными?
2. Что значит быть непрерывным? Группы, разделяющие столбцы, всегда упоминаются перед точкой, и они могут содержать или не содержать подчеркивание. Пример: dataset1.colA, dataset_09.colA
Ответ №1:
Используйте диктант и удерживайте данные
from collections import defaultdict
lst = ['ds_a.cola','ds_a.colb','ds_b.cola','ds_b.colb','ds_x.cola','ds_x.colb']
data = defaultdict(list)
for entry in lst:
a,_ = entry.split('.')
data[a].append(entry)
print(data)
выход
defaultdict(<class 'list'>, {'ds_a': ['ds_a.cola', 'ds_a.colb'], 'ds_b': ['ds_b.cola', 'ds_b.colb'], 'ds_x': ['ds_x.cola', 'ds_x.colb']})
Комментарии:
1. @DaniMesejo Вы абсолютно правы.. Самое смешное, что есть еще один ответ, который выглядит так же 🙂
2. @DaniMesejo, на что ты пытаешься претендовать ? Пожалуйста, поделитесь этим.
3. Вы можете добавить
maxsplit
, чтобы избежать возможногоValueError
.entry.split('.', 1)
Или/И вы можете использоватьa, *_ = entry.split('.', 1)
, чтобы не получить ошибку, если"."
в строке нет.
Ответ №2:
Попробуй itertools.groupby
:
>>> from itertools import groupby
>>> [list(v) for _, v in groupby(lst, key=lambda x: x[x.find('_') 1])]
[['ds_a.cola', 'ds_a.colb'], ['ds_b.cola', 'ds_b.colb']]
>>>
Комментарии:
1. Группы, разделяющие столбцы, всегда упоминаются перед точкой, и они могут содержать или не содержать подчеркивание. Так будет ли этот разрыв без подчеркивания?
2. @Фазли Это зависит от того, что вы должны сначала попробовать.
Ответ №3:
Вы можете нанести их на карту:
from collections import defaultdict
lst = ['ds_a.cola','ds_a.colb','ds_b.cola','ds_b.colb']
ds_dict = defaultdict(list)
for item in lst:
key, value = item.split(".")
ds_dict[key].append(value)
print(dict(ds_dict))
Выход:
{'ds_a': ['cola', 'colb'], 'ds_b': ['cola', 'colb']}
Ответ №4:
попробуйте это:
d = dict()
for item in lst:
key = item.split(".")[0]
if key not in d.keys():
d[key] = list()
d[key].append(item)
Ответ №5:
используйте два повторяющихся регулярных выражения: одно для периода ds_a и одного или нескольких слов, а также для периода ds и одного или нескольких слов. Игнорируйте пустую группу и используйте defaultdict для добавления значений в набор.
lst = ['ds_a.cola','ds_a.colb','ds_b.cola','ds_b.colb']
pattern=r"(?:bds_a.w bs*)*(?:bds_b.w bs*)*"
строка=» «.присоединиться(lst)
groups=re.findall(pattern,string)
dict=defaultdict(set)
for group in groups:
for item in group.split():
if item !="":
print(item)
key,*value=item.split('.')
dict[key].add(value[0])
печать(диктант)
выход:
defaultdict(<class 'set'>, {'ds_a': {'cola', 'colb'}, 'ds_b': {'cola', 'colb'}})