Разделение элементов списка на основе подстроки

#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'}})