删除列表中字符串内的日期和年份重复

时间:2017-08-28 19:48:48

标签: python regex string python-3.x

我有这种清单(例子):

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年9月它重复 - 必须是月份和年份),我会有一些更大的字符串,但他们和我的例子一样,我如何实现我想要的输出?谢谢!我使用python 3。

6 个答案:

答案 0 :(得分:2)

循环迭代您的项目并重新分配。您可以使用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']]

这假设您的日期完全由,分隔,如果不是这样,则需要更复杂的解决方案。

答案 1 :(得分:2)

假设订购并不重要:

    $conn_array = array (
    "UID" => "",
    "PWD" => "",
    "Database" => "dbName"
);

答案 2 :(得分:1)

使用将列表转换为set的事实会删除重复项。下面的示例就是这样 - 将字符串拆分为列表,将其转换为集合,将转换回列表,将其连接回字符串。

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)

请注意,月份的顺序可能不会保留 - 未订购。

答案 3 :(得分:1)

这是另一种解决方案:

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

答案 4 :(得分:0)

这是一个滥用生成器和列表推导的解决方案 - 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)仍然会被选中并正确格式化)

答案 5 :(得分:0)

如果您对订单搞砸了没问题,可以将其更改为一组并将其更改为列表。使用您的示例:

newlist = [[sublist [0],','。join(set(sublist [1] .split(',')))]]用于mylist中的子列表]

在我的结尾运行它,这是输出:

<[> [[20,'2013年8月,2015年9月,2016年9月'],[30,'2012年8月']] 2012年,2012年8月',30]]