7
votes

Combinant la liste 2D des tuples puis les trier à Python

mise à jour: la liste est remplie de chaînes que j'ai édité la liste pour afficher ce

J'ai 3 différentes liste tels que P>

  Sorted_list = [('1', '1', '1', '1.1', '1.2', '1.2', '2', '2.2', '3', '3.2', '3.5'), 
                 ('1', '1', '1', '1', '3', '2', '2', '2', '2', '3', '5'),
                 ('General', 'More', 'Another', 'Info', 'Titles', 'List', 'Info', 'Section', 'Here', 'Of', 'Strings')


0 commentaires

3 Réponses :


2
votes

Vous pouvez faire:

from itertools import chain

tuples = zip(map(float, list(chain(*Section))), 
             list(chain(*Page)), 
             list(chain(*Title)))

zip(*sorted(tuples, key=lambda x: x[0]))

Out[232]:
[(1.0, 1.0, 1.0, 1.1, 1.2, 1.2, 2.0, 2.2, 3.0, 3.2, 3.5),
 ('1', '1', '1', '1', '3', '2', '2', '2', '2', '3', '5'),
 ('General',
  'More',
  'Another',
  'Info',
  'Titles',
  'List',
  'Info',
  'Section',
  'Here',
  'Of',
  'Strings')]


5 commentaires

J'ai oublié d'inlcucer dans le code d'origine que la liste est remplie de chaînes. J'ai mis à jour le poste pour montrer ceci. J'ai essayé votre méthode, puis imprimé la valeur des tuples et la deuxième ligne du code. Ils ont renvoyé et respectivement. Ce sont des emplacements dans la mémoire correcte? Est-ce que cela s'est produit parce qu'ils sont en fait des cordes?


J'ai mis à jour ma réponse pour prendre en compte le fait que vous avez des chaînes.


Lorsque j'imprimer la liste, j'obtiens toujours . Pas certain de pourquoi...


Je suppose que c'est due à la version Python ... quel retour tuples en premier? Une liste? Essayez d'envelopper le zip avec la liste () .


Oui dans Python 3 Zip renvoie un itérateur.



2
votes

Essayez ceci,

Section = [('1', '1.1', '1.2'), ('1', '2', '2.2', '3'), ('1', '1.2', '3.2', '3.5')] 
Page = [('1', '1', '3'), ('1', '2', '2', '2'), ('1', '2', '3', '5')]
Titles = [('General', 'Info', 'Titles'), ('More', 'Info', 'Section', 'Here'), ('Another', 'List', 'Of', 'Strings')]

# Flat a list of tuples into a list
l1 = [item for sublist in Section for item in sublist]
l2 = [item for sublist in Page for item in sublist]
l3 = [item for sublist in Titles for item in sublist]

# Python2, `zip` returns a list of tuples
#result = zip(*sorted(zip(l1, l2, l3), key=lambda x:float(x[0])))

# Python3, `zip` returns an iterator of tuples
result = list(zip(*sorted(zip(l1, l2, l3), key=lambda x:float(x[0]))))

print(result)
# Output
[   ('1', '1', '1', '1.1', '1.2', '1.2', '2', '2.2', '3', '3.2', '3.5'), 
    ('1', '1', '1', '1', '3', '2', '2', '2', '2', '3', '5'), 
    ('General', 'More', 'Another', 'Info', 'Titles', 'List', 'Info', 'Section', 'Here', 'Of', 'Strings')]


7 commentaires

Lorsque j'imprime le résultat, il retourne . Quel est un emplacement en mémoire, non? Pourquoi cela reviendrait-il ça?


@JStuff, puisque vous utilisez python3, ajoutez list à l'avant de zip (...) . Zip dans Python3 retourne un itérateur. Vérifiez ma réponse modifiée.


Parfait, c'est exactement ce que je cherchais! Question rapide cependant. Dans les données que je travaille avec elle a des décimales au deuxième décimal, de sorte que 1,10, 1,11, etc. et elle triée ceci comme 1, 1.1, 1.10, 1.1, etc. Y a-t-il un moyen de dire à Python de le trier 1,1, 1.2, ..., 1.9, 1.10, etc.?


@Jstuff, bonne question. Diviser un nombre en parties entier et décimales, utilisez zip pour les emballer, triez-les et intégrez-les.


Ours avec moi, je suis toujours nouveau à Python. J'ai essayé de faire l1_float = [float (i) pour I dans L1], mais il chute le zéro de 1,10 de sorte qu'il a 1, 1,1, 1,1, 1,2 au lieu de 1, 1.1, 1.2, 1.10.0 y a-t-il un Un meilleur moyen de le faire pour que cela garde les zéros traînants? Aussi, pourquoi flottez-vous la valeur que vous transmettez en Lambda?


@Jstuff, je viens de poster une nouvelle question, Comment puis-je trier une liste de numéros de section dans Python? .


Laissez-nous Continuez cette discussion dans le chat .



-1
votes

Mon approche. Liste compréhension et pas besoin d'importer des modules. Je pense que c'est rapide, et c'est très simple.

Edit: J'ai ajouté une approche non traitée et une approche triée. P>

#Unsorted
newList =[
    [item for sublist in Section for item in sublist],
    [item for sublist in Page for item in sublist],
    [item for sublist in Titles for item in sublist]
    ]

print newList
#Output
#[[1, 1.1, 1.2, 1, 2, 2.2, 3, 1, 1.2, 3.2, 3.5], 
# [1, 1, 3, 1, 2, 2, 2, 1, 2, 3, 5], 
# ['General', 'Info', 'Titles', 'More', 'Info', 'Section', 'Here', 'Another', 'List', 'Of', 'Strings']]

#Sort first two lists afterwards, if desired
for i in range(2):
    newList[i].sort()

print newList
#Output
#[[1, 1, 1, 1.1, 1.2, 1.2, 2, 2.2, 3, 3.2, 3.5], 
# [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 5], 
# ['General', 'Info', 'Titles', 'More', 'Info', 'Section', 'Here', 'Another', 'List', 'Of', 'Strings']]


3 commentaires

Ce n'est pas le résultat souhaité de OP puisque vous triez la liste de manière indépendante.


@sparkandshine ah, je vois qu'il a dit qu'il voulait une forme où il pourrait être trié par la suite. Merci pour les commentaires. Je vais éditer ma réponse.


Peut-être que je n'ai pas fait cela clair, je veux seulement trier la section de la liste et que le reste des deux autres liste doit être trié dans le même ordre de la section de la liste après le tri. Par exemple, si, après la section de tri, les premiers indices ont changé à 2, 4, 1. Les deux autres liste devraient modifier leurs indices à 2, 4, 1.