Python:根据先前的列表顺序重新排序字符串(列表)

时间:2014-01-26 23:28:05

标签: python list sorting

我很难过,任何帮助都会很棒,这远高于我的薪水等级:

我有一串键值,在识别时会提供一个数字。更复杂的是它们被识别为int或string。

目标是当处理新字符串时,它应该使用先前可能已经定义的原始密钥顺序。此外,价值可能总是不同

以下是从第一个字符串中获取的信息示例:

import re
int_dict = {}
string_dict = {}
int_number = 1
string_number = 1
firstlist = "key_a=apples key_z=4 key_e=pears key_b=bananas key_r=3"
re_result = re.findall(r'(\w+)=(\w+)', firstlist)
for i in re_result:
   if i[1].isdigit():
        int_dict[int_number] = i[0]
        int_number += 1
   else:
        string_dict[string_number] = i[0]
        string_number += 1

print int_dict
>>> {1: 'key_z', 2: 'key_r'}
print string_dict
>>> {1: 'key_a', 2: 'key_e', 3: 'key_b'}

第二行可以如下:

secondstring = "key_r=54 key_a=grapes key_b=nuts key_z=7 key_r=22"

我希望字符串基于前一个字符串重新排序,在第二个字符串中还有一个新键,如果它是一个int或字符串,它应该只取下一个增量:

secondstring_reordered = "key_a=grapes key_z=7 key_b=nuts key_r=22 key_z=7"

1 个答案:

答案 0 :(得分:1)

首先使用第一个字符串创建一个字典,其中键是字符串中的键,value是firstlist.split()返回的列表中该项的索引

>>> d = {item.split('=', 1)[0]:i for i, item in enumerate(firstlist.split())}
>>> d
{'key_e': 2, 'key_b': 3, 'key_a': 0, 'key_r': 4, 'key_z': 1}

现在使用此词典,您可以对secondstring.split()返回的列表进行排序,然后使用str.join将其加入:

>>> ' '.join(sorted((item for item in secondstring.split()),
                                                 key=lambda x:d[x.split('=',1)[0]]))
'key_a=grapes key_z=7 key_b=nuts key_r=54 key_r=22'

如果您确定字符串中的值永远不会包含=,那么您可以将item.split('=', 1)x.split('=',1)[0]更改为item.split('=')[1]x.split('=')[1]分别