Вы можете использовать решение из this с разделенными значениями для Fake
и Real
строк, отсортированных по убыванию, и чисел, отсортированных по возрастанию:
L = ['BuzzFeed_Real_5-Webpage.json',
'BuzzFeed_Fake_9-Webpage.json',
'BuzzFeed_Fake_6-Webpage.json',
'BuzzFeed_Fake_5-Webpage.json',
'BuzzFeed_Fake_8-Webpage.json',
'BuzzFeed_Real_6-Webpage.json',
'BuzzFeed_Real_7-Webpage.json',
'BuzzFeed_Real_8-Webpage.json',
'BuzzFeed_Real_9-Webpage.json',
'BuzzFeed_Real_2-Webpage.json',
'BuzzFeed_Real_4-Webpage.json',
'BuzzFeed_Real_1-Webpage.json',
'BuzzFeed_Real_10-Webpage.json',
'BuzzFeed_Fake_4-Webpage.json',
'BuzzFeed_Fake_10-Webpage.json',
'BuzzFeed_Fake_1-Webpage.json',
'BuzzFeed_Fake_2-Webpage.json',
'BuzzFeed_Real_3-Webpage.json',
'BuzzFeed_Fake_3-Webpage.json',
'BuzzFeed_Fake_7-Webpage.json']
class reversor:
def __init__(self, obj):
self.obj = obj
def __eq__(self, other):
return other.obj == self.obj
def __lt__(self, other):
return other.obj < self.obj
a = sorted(L, key=lambda x: (reversor(x.split('_')[1]), int(x.split('_')[2].split('-')[0])))
print (a)
['BuzzFeed_Real_1-Webpage.json', 'BuzzFeed_Real_2-Webpage.json',
'BuzzFeed_Real_3-Webpage.json', 'BuzzFeed_Real_4-Webpage.json',
'BuzzFeed_Real_5-Webpage.json', 'BuzzFeed_Real_6-Webpage.json',
'BuzzFeed_Real_7-Webpage.json', 'BuzzFeed_Real_8-Webpage.json',
'BuzzFeed_Real_9-Webpage.json', 'BuzzFeed_Real_10-Webpage.json',
'BuzzFeed_Fake_1-Webpage.json', 'BuzzFeed_Fake_2-Webpage.json',
'BuzzFeed_Fake_3-Webpage.json', 'BuzzFeed_Fake_4-Webpage.json',
'BuzzFeed_Fake_5-Webpage.json', 'BuzzFeed_Fake_6-Webpage.json',
'BuzzFeed_Fake_7-Webpage.json', 'BuzzFeed_Fake_8-Webpage.json',
'BuzzFeed_Fake_9-Webpage.json', 'BuzzFeed_Fake_10-Webpage.json']
Другая похожая идея по pandas - разделение значений по новым столбцам и последняя сортировка по DataFrame.sort_values
:
df = pd.DataFrame({'a':L})
df = df.join(df['a'].str.split('_', expand=True))
df['num'] = df[2].str.extract('(\d+)', expand=False).astype(int)
df = df.sort_values([1, 'num'], ascending=[False, True])
print (df)
a 0 1 2 num
11 BuzzFeed_Real_1-Webpage.json BuzzFeed Real 1-Webpage.json 1
9 BuzzFeed_Real_2-Webpage.json BuzzFeed Real 2-Webpage.json 2
17 BuzzFeed_Real_3-Webpage.json BuzzFeed Real 3-Webpage.json 3
10 BuzzFeed_Real_4-Webpage.json BuzzFeed Real 4-Webpage.json 4
0 BuzzFeed_Real_5-Webpage.json BuzzFeed Real 5-Webpage.json 5
5 BuzzFeed_Real_6-Webpage.json BuzzFeed Real 6-Webpage.json 6
6 BuzzFeed_Real_7-Webpage.json BuzzFeed Real 7-Webpage.json 7
7 BuzzFeed_Real_8-Webpage.json BuzzFeed Real 8-Webpage.json 8
8 BuzzFeed_Real_9-Webpage.json BuzzFeed Real 9-Webpage.json 9
12 BuzzFeed_Real_10-Webpage.json BuzzFeed Real 10-Webpage.json 10
15 BuzzFeed_Fake_1-Webpage.json BuzzFeed Fake 1-Webpage.json 1
16 BuzzFeed_Fake_2-Webpage.json BuzzFeed Fake 2-Webpage.json 2
18 BuzzFeed_Fake_3-Webpage.json BuzzFeed Fake 3-Webpage.json 3
13 BuzzFeed_Fake_4-Webpage.json BuzzFeed Fake 4-Webpage.json 4
3 BuzzFeed_Fake_5-Webpage.json BuzzFeed Fake 5-Webpage.json 5
2 BuzzFeed_Fake_6-Webpage.json BuzzFeed Fake 6-Webpage.json 6
19 BuzzFeed_Fake_7-Webpage.json BuzzFeed Fake 7-Webpage.json 7
4 BuzzFeed_Fake_8-Webpage.json BuzzFeed Fake 8-Webpage.json 8
1 BuzzFeed_Fake_9-Webpage.json BuzzFeed Fake 9-Webpage.json 9
14 BuzzFeed_Fake_10-Webpage.json BuzzFeed Fake 10-Webpage.json 10
a = df['a'].tolist()
print (a)
['BuzzFeed_Real_1-Webpage.json', 'BuzzFeed_Real_2-Webpage.json',
'BuzzFeed_Real_3-Webpage.json', 'BuzzFeed_Real_4-Webpage.json',
'BuzzFeed_Real_5-Webpage.json', 'BuzzFeed_Real_6-Webpage.json',
'BuzzFeed_Real_7-Webpage.json', 'BuzzFeed_Real_8-Webpage.json',
'BuzzFeed_Real_9-Webpage.json', 'BuzzFeed_Real_10-Webpage.json',
'BuzzFeed_Fake_1-Webpage.json', 'BuzzFeed_Fake_2-Webpage.json',
'BuzzFeed_Fake_3-Webpage.json', 'BuzzFeed_Fake_4-Webpage.json',
'BuzzFeed_Fake_5-Webpage.json', 'BuzzFeed_Fake_6-Webpage.json',
'BuzzFeed_Fake_7-Webpage.json', 'BuzzFeed_Fake_8-Webpage.json',
'BuzzFeed_Fake_9-Webpage.json', 'BuzzFeed_Fake_10-Webpage.json']