我有一个看起来像这样的列表:
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'
结尾答案 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']