объединять строки из списка по условию - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть список строк :

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

, и я хочу отсортировать так, чтобы результат был:

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

Каждый элемент после 'D D R ..' должен быть связан с ним до у нас есть новый 'D D R ..'

Есть либыстрая команда, чтобы сделать такую ​​вещь?Я пробовал это, но это не работает.

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

Спасибо!

Ответы [ 3 ]

0 голосов
/ 29 сентября 2018

Вопрос : Каждый элемент после 'DDR ..' должен быть связан с ним, пока у нас не появится новый 'DDR ..'

НеБитва с Indizies!Например:

Примечание : listInfos имеет для начала с 'DD 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)

Выход :

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

Протестировано с Python: 3.5.3

0 голосов
/ 30 сентября 2018

Вы можете написать это в одном выражении.Я сомневаюсь, что это читабельно, но просто для удовольствия:

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']

Мы получаем подсписок между двумя DDR через itertools.takewhile, начиная с индекса, следующего за текущим (индекс выбирается с enumerate)

0 голосов
/ 29 сентября 2018

Если вы хотите, чтобы список содержал только отсортированные даты, используйте:

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)

Объяснение:

  1. Здесь мы вставляем даты, начинающиеся с ваших пользовательскихпрефикс «DD R»:

    [date for date in listInfos if date.startswith('D D R')]
    
  2. Теперь мы сортируем указанный список по дате, зная, что обратные даты в виде целого числа могут быть ключом, потому что, например, это: 20181012 <20181226 </p>

    key=lambda date: int(date[-4:] + date[-7:-5] + date[-10:-8]
    
  3. Далее мы инвертируем результат в порядке возрастания (необязательно)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...