4 votes

joindre des chaînes de caractères d'une liste par condition

J'ai ceci liste de chaînes de caractères :

listInfos = ['D D R: 17/10/2018', 'nothing past this date', 'D D R: 4/10/2018', 'D D R: 2/10/2018']

et je veux trier de telle sorte que le résultat soit :

parsedList = ['D D R: 17/10/2018 & nothing past this date', 'D D R: 4/10/2018', 'D D R: 2/10/2018']

Chaque élément après un 'D D R ..' devrait être associé avec elle jusqu'à nous avons un nouveau 'D D R ..'

Existe-t-il une commande rapide pour faire une telle chose ? J'ai essayé mais cela ne fonctionne pas.

parsedList = []
for i in range(len(listeInfos)):
        tmpList = []
        if re.match(r'^D D R', listeInfos[i]):
                tmpList.append(listeInfos[i])
                while not(re.match(r'^D D R', listeInfos[i+1])):
                        tmpList.append(listeInfos[i])
                        i += 1
                else:
                        parsedList.append(tmpList)
                        break
                break
        i = j

Gracias.

3voto

stovfl Points 7200

Question : Tout élément situé après un "D D R " doit lui être associé jusqu'à ce que nous ayons un nouveau "D D R

Ne vous battez pas avec les Indiens ! Par exemple :

Note : listInfos a pour commencer D D R ¡!

listInfos = ['D D R: 17/10/2018', 'nothing past this date', 'D D R: 4/10/2018', 'D D R: 2/10/2018']

parsedList = []

# Loop the List of Strings
for s in listInfos:
    # Condition not
    if not s.startswith('D D R'):
        # if True concat 's' with the last String in the List
        parsedList[-1] += " " + s
    else:
        # Append 's' as a new String to the List
        parsedList.append(s)

for s in parsedList:
    print(s)

Sortie :

D D R: 17/10/2018 nothing past this date
D D R: 4/10/2018
D D R: 2/10/2018`

Testé avec Python:3.5.3

1voto

Yoav Abadi Points 336

Si vous souhaitez que la liste ne contienne que les dates triées, utilisez :

parsedList = sorted([date for date in listInfos if date.startswith('D D R')],
                key=lambda date: int(date[-4:] + date[-7:-5] + date[-10:-8]), reverse=True)

Explication :

  1. Nous insérons ici les dates qui commencent par votre préfixe personnalisé "D D R" :

    [date for date in listInfos if date.startswith('D D R')]
  2. Maintenant, nous trions cette liste, par date, tout en sachant que l'inversion des dates en tant qu'entier peut être la clé, parce que, par exemple, cela : 20181012 < 20181226

    key=lambda date: int(date[-4:] + date[-7:-5] + date[-10:-8]
  3. Ensuite, nous inversons le résultat, pour qu'il soit dans l'ordre croissant (facultatif)

J'espère que cela vous aidera.

1voto

Sasha Tsukanov Points 794

Vous pouvez l'écrire en une seule expression. Je doute que ce soit lisible, mais c'est juste pour le plaisir :

from itertools import takewhile

parsedList = [
    (el + ' & ' + ' '.join(
            takewhile(lambda x: not x.startswith('D D R'), listInfos[pos + 1:])
        )
     ).rstrip(' &')
    for pos, el in enumerate(listInfos) if el.startswith('D D R')
]

print(parsedList)
# ['D D R: 17/10/2018 & nothing past this date', 'D D R: 4/10/2018', 'D D R: 2/10/2018']

Nous obtenons une sous-liste entre deux DDR via itertools.takewhile à partir de l'index suivant l'index actuel (l'index est récupéré avec enumerate )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X