2
votes

diviser une liste à l'aide de list pour obtenir des listes plus petites

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)


1 commentaires

Veuillez mettre à jour la question avec le code que vous avez essayé.


4 Réponses :


0
votes

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)


1 commentaires

Cela fonctionne, mais je crois qu'il existe une manière plus "pythonique" (venant du fond C)



1
votes
  1. 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']}
    
  2. 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']]
    
  3. 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]
      

0 commentaires

0
votes
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)

0 commentaires

0
votes

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


0 commentaires