У меня есть такой список (пример):

mylist = [[20,'September 2015, August 2013, September 2016, September 2015'], [30, 'August 2012, August 2012']]

И желаемый результат такой:

mylist = [[20,'September 2015, August 2013, September 2016'], [30, 'August 2012']]

По сути, я хочу удалить дату и год из этой строки каждый раз, когда точная дата и год повторяются, как в моем примере (сентябрь 2015 года повторяется - должны быть месяц и год), у меня будут несколько более крупные строки, но они такие же, как мой пример, как я могу достичь желаемого результата? Спасибо! Я использую Python 3.

3
Rommel 28 Авг 2017 в 22:48

6 ответов

Лучший ответ

Предполагая, что порядок не важен:

>>> [[tup[0], ', '.join(d for d in set(tup[1].split(', ')))] for tup in mylist]
[[20, 'August 2013, September 2015, September 2016'], [30, 'August 2012']]
2
Alexander 28 Авг 2017 в 20:02

Вот решение, использующее генераторы и списки - Python (tm)

from collections import OrderedDict

mylist = [[20,'September 2015, August 2013, September 2016, September 2015'], [30, 'August 2012, August 2012']]
mylist = [
  [x[0], ", ".join(OrderedDict.fromkeys([y.strip() for y in x[1].split(",")]).keys())]
  for x in mylist
]

Я учитываю странное форматирование в элементах списка, только предполагая, что список разделен ,, по крайней мере (поэтому September 2010,September 2010) все равно будет выбран и отформатирован правильно)

0
Tyler Sebastian 28 Авг 2017 в 19:57

Используйте тот факт, что преобразование списка для установки удаляет дубликаты. Пример ниже делает именно это - разбивает строку на список, преобразует ее в набор, преобразует обратно в список, присоединяет ее обратно к строке.

mylist = [[20,'September 2015, August 2013, September 2016, September 2015'], [30, 'August 2012, August 2012']]
newlist = []
for item in mylist:
    newlist.append([item[0], ", ".join(list(set(item[1].split(", "))))])
print(newlist)

Обратите внимание, что порядок месяцев не может быть сохранен - набор не упорядочен.

1
Honza Zíka 28 Авг 2017 в 19:58

Если вы в порядке с запутанным порядком, вы можете изменить его на набор и вернуть обратно в список. Используя ваш пример:

Newlist = [[sublist [0], ',' .join (set (sublist [1] .split (',')))] для подсписка в mylist]

Запустить его на моем конце, это вывод:

[[20, «Август 2013, сентябрь 2015, сентябрь 2016»], [30, «Август 2012»]] 2012, август 2012 », 30]]

0
jabargas 28 Авг 2017 в 20:17

Перебирайте свои элементы в цикле и переназначайте. Вы бы выиграли от использования collections.OrderedDict для удаления дубликатов.

from collections import OrderedDict

for i, l in enumerate(mylist):
     mylist[i] = [l[0], ', '.join(OrderedDict.fromkeys(l[1].split(', ')).keys())]

print(mylist)    
[[20, 'September 2015, August 2013, September 2016'], [30, 'August 2012']]

Это предполагает, что ваши даты разделены точно ,, и если это не так, необходимо более сложное решение.

2
cs95 28 Авг 2017 в 19:52

Вот еще одно решение:

 map(lambda x: [x[0]] + list(set([i.strip() for i in x[1].split(',')])), my list)

[[20, 'August 2013', 'September 2015', 'September 2016'], [30, 'August 2012']]
1
aws_apprentice 28 Авг 2017 в 20:01