comment puis-je diviser une liste à l'aide d'une liste prédéfinie, je veux diviser la liste x en plusieurs listes plus petites (ou dictionnaires) lorsqu'un élément de la liste titres est found
new_list=[['a',3,4,2],['c','b','b1',2],['g'],['final',...]]
# OR
my_dict={'a':[3,4,2],'c':['b','b1',2],'g':[],'final':[...]}
résultat attendu
titles=['a','c','g','final'] x=['a',3,4,2,'c','b','b1',2,'g','final',...]
Remarque: les éléments dans les titres sont uniques dans x (c'est-à-dire que 'a' ne sera pas trouvé plus d'une fois dans x)
4 Réponses :
avec prise en charge des duplications dans titles
titles = ['a', 'c', 'g', 'final']
x = ['a', 3, 4, 2, 'c', 'b', 'b1', 2, 'g', 'final', 'r', 'gg']
new_list = []
starting_index = 0
for i in range(0, len(titles) - 1):
f = x.index(titles[i], starting_index)
t = x.index(titles[i + 1], starting_index)
sub_list = x[f:t]
new_list.append(sub_list)
starting_index = t
l = x.index(titles[-1])
last_sub_list = x[l:]
new_list.append(last_sub_list)
print(new_list)
Cela fonctionne, mais je crois qu'il existe une manière plus "pythonique" (venant du fond C)
Vous pouvez calculer les index de chaque titre:
resultdict = {x[fr]: x[fr + 1:to] for fr, to in zip(indexes, indexes[1:] + [None])}
# {'a': [3, 4, 2], 'c': ['b', 'b1', 2], 'g': [], 'final': ['value']}
Puis zip index avec index [1:] cela fera des paires de chaque index avec le suivant: p>
resultlist = [x[fr:to] for fr, to in zip(indexes, indexes[1:] + [None])] # [['a', 3, 4, 2], ['c', 'b', 'b1', 2], ['g'], ['final', 'value']]
Ensuite, utilisez-le pour diviser:
Pour obtenir la liste des sous-listes:
z = zip(indexes, indexes[1:] + [None]) print(list(z)) # [(0, 4), (4, 8), (8, 9), (9, None)]
Pour obtenir le dict:
indexes = list(map(x.index, titles)) # or indexes = [x.index(title) for title in titles]
titles=['a','c','g','final']
x=['a',3,4,2,'c','b','b1',2,'g','final','r', 'gg']
result = []
for idx, val in enumerate(x):
if val in titles:
sublist = [val]
i = idx+1
while (i < len(x) and x[i] not in titles):
sublist.append(x[i])
i += 1
result.append(sublist)
idx += (i-idx)
print(result)
Une solution à cela serait:
{'a': [3, 4, 2], 'c': ['b', 'b1', 2], 'g': [], 'final': ['x', 'y', 'z']}
ou
result = {
x[x.index(i)]: x[x.index(i) + 1 : x.index(j) if j else None]
for i, j in zip(titles, titles[1:] + [None])
}
print(result)
Résultat:
result = {
x[x.index(i)]: x[x.index(i) : j and x.index(j)]
for i, j in zip(titles, titles[1:] + [None])
}
Veuillez mettre à jour la question avec le code que vous avez essayé.