与其他子字符串比较后返回字符串的最大值-Python

时间:2019-04-26 18:20:55

标签: python string

我有一个看起来像这样的列表:

json_file_list = ['349148424_20180312071059_20190402142033.json','349148424_20180312071059_20190405142033.json','360758678_20180529121334_20190402142033.json']

和一个空列表:

list2 = []

我想做的是比较字符直到第二个下划线'_',如果它们相同,我只想将完整字符串的最大值附加到新列表中。在上述情况下,前2个条目是重复项(直到第二个下划线),因此我想根据第二个下划线之后的数字来确定最大值。所以最终的list2只有2个条目,而没有3

我尝试过:

for row in json_file_list:
    if row[:24] == row[:24]:
        list2.append(max(row))
    else:
        list2.append(row)

但这只是返回:

['s', 's', 's']

最终输出应为:

['349148424_20180312071059_20190405142033.json','360758678_20180529121334_20190402142033.json']

有什么想法吗?我也意识到这段代码对我的切片方式很脆弱(如果字符串变长/变短会发生什么),所以我需要想出一种更好的方法。如果不在第二个下划线下,则可能是基准。字符串将始终以'.json'

结尾

3 个答案:

答案 0 :(得分:1)

此代码段中的if语句:

for row in json_file_list:
    if row[:24] == row[:24]:
        list2.append(max(row))
    else:
        list2.append(row)

始终解析为True。考虑一下,row[:24]与自身有何不同?假设它解析为True,它将在字母表(和您的字符串)中将距离最远的字母s添加到list2中。这就是为什么您得到['s', 's', 's']的输出的原因。

也许我不正确地理解了您的请求,但是您不能只是将行的所有元素附加到列表中,然后删除重复项吗?

for row in json_file_list:
    for elem in row:
        list2.append(elem)
list2 = sorted(list(set(list2)))

答案 1 :(得分:1)

我会使用字典来做到这一点:

from collections import defaultdict

d = defaultdict(list)
for x in json_file_list:
    d[tuple(x.split("_")[:2])].append(x)


new_list = [max(x) for x in d.values()]
new_list

输出:

['349148424_20180312071059_20190405142033.json',
 '360758678_20180529121334_20190402142033.json']

答案 2 :(得分:1)

我想您可以拼接要比较的内容,并使用内置的“ set”来完成您的区别:

set([x[:24] for x in json_file_list])
set(['360758678_20180529121334', '349148424_20180312071059'])

稍后再加入其余文本将很简单

list2=[]
for unique in set([x[:24] for x in json_file_list]):
  list2.append(unique + json_file_list[0][24:])

list2
['360758678_20180529121334_20190402142033.json',
 '349148424_20180312071059_20190402142033.json']