提问人:Fazli 提问时间:10/11/2021 更新时间:10/13/2021 访问量:733
基于子字符串拆分列表元素
Splitting list elements based on substring
问:
如何根据点前的字符串拆分此元素中的元素,而无需在代码中显式编写?
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 中实现这一点?
答:
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.maxsplit
ValueError
entry.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'}})
上一个:从字符串创建字典
评论