我正在尝试从包含带有元素名称,日期和其他数据的sub_list的列表中删除类似的元素:
basket = [['cheese', '2015/04/16', 'junk'],['apple', '2015/04/15', 'other junk'],['apple', '2015/03/15', 'dessert'],['cheese', '2017/04/16', 'pie'],['banana', '2015/04/16', ''],['cheese', '2017/04/10', '']]
如果元素名称(水果)在列表中出现两次,程序应比较日期并删除旧元素。我正在使用 datetime 来比较第二个元素,这部分正在运行。但是当我遍历列表时,它会一直跳过'banana'
。这应该是要添加的最后一项。
我尝试过这种方法:
def date_convert(date):
"""Takes a date string in the form YYYY/MM/DD and converts it to a
date object for comparisons."""
# Split date string by ".", " ", "/", or "-" to handle a wider range
# of possible inputs.
date = re.split('[. /\-]', date)
# Strip month of "0" because datetime does not accept that as valid
# input.
if(date[1][0] == '0'):
date[1] = date[1].strip('0')
return datetime.date(int(date[0]), int(date[1]), int(date[2]))
basket = [['cheese', '2015/04/16'],['apple', '2015/04/15'],['apple', '2015/03/15'],['cheese', '2017/04/16'],['banana', '2015/04/16'],['cheese', '2017/04/10']]
new_basket = []
for food in basket:
basket.remove(food)
for food2 in basket:
if food[0].upper() == food2[0].upper():
basket.remove(food2)
if date_convert(food[1]) > date_convert(food2[1]):
pass
else:
food = food2
else: new_basket.append(food)
print str(new_basket)
并收到此打印件:[['cheese', '2017/04/16', 'pie'], ['apple', '2015/04/15', 'other junk']]
根据调试器,它永远不会在for循环中达到banana。
答案 0 :(得分:1)
这是一个选项。使用defaultdict
按内部子列表的第一项进行分组。使用transform
查找自定义text
函数的最大日期,以帮助将日期字符串作为实际日期进行比较:
max()
打印:
key
请注意,在这种情况下您将丢失订单。