基于子字符串拆分列表元素

Splitting list elements based on substring

提问人:Fazli 提问时间:10/11/2021 更新时间:10/13/2021 访问量:733

问:

如何根据点前的字符串拆分此元素中的元素,而无需在代码中显式编写?

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 中实现这一点?

Python Pandas DataFrame numpy 数据操作

评论

0赞 Dani Mesejo 10/11/2021
这些组总是连续的吗?
0赞 Fazli 10/11/2021
你说的连续是什么意思?分隔列的组总是在点之前提及,它们可能包含也可能不包含下划线。例如:dataset1.colA、dataset_09.colA

答:

2赞 U13-Forward 10/11/2021 #1

尝试: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']]
>>> 

评论

0赞 Fazli 10/11/2021
分隔列的组总是在点之前提及,它们可能包含也可能不包含下划线。那么这个突破会不会没有下划线呢?
0赞 U13-Forward 10/11/2021
@Fazli 视情况而定,您应该先尝试一下。
0赞 David Meu 10/11/2021 #2

您可以映射它们:

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']}
3赞 balderman 10/11/2021 #3

使用字典并保存数据

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

评论

0赞 balderman 10/11/2021
@DaniMesejo 你是绝对正确的..有趣的是,还有另一个看起来相同的答案:-)
0赞 balderman 10/11/2021
@DaniMesejo 你想说什么?请分享。
0赞 Olvin Roght 10/11/2021
您可以添加以避免可能的. 或者/你可以使用 To not get error if there's no in string.maxsplitValueErrorentry.split('.', 1)a, *_ = entry.split('.', 1)"."
0赞 Shireen 10/11/2021 #4

试试这个:

 d = dict()
 for item in lst:
     key = item.split(".")[0]
     if key not in d.keys():
         d[key] = list()
     d[key].append(item)
0赞 Golden Lion 10/13/2021 #5

使用两个重复的正则表达式:一个表示句点和一个或多个单词ds_a DS 句点和一个或多个单词。忽略空组并使用 defaultdict 向集合添加值。

 lst = ['ds_a.cola','ds_a.colb','ds_b.cola','ds_b.colb']
 pattern=r"(?:\bds_a\.\w+\b\s*)*(?:\bds_b\.\w+\b\s*)*"

字符串=“ ”.join(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])

print(字典)

输出:

 defaultdict(<class 'set'>, {'ds_a': {'cola', 'colb'}, 'ds_b': {'cola', 'colb'}})