我有一个字符串列表,如下所示:
['dsafjhsafjkhefhajwejh;NR;123;dfgdsrhgjhdfgjhdsfjhg','jhfewrgjhdfjhgsufgssdfjgh;NR;3243;fgjdsgfjsdfkjgdf', ...]
此列表应按“;”之间的数字排序,数字始终位于“; NR;”之后,但不是每个字符串都包含一个数字。我已经尝试了数百种解决方案,但似乎都没有。
请帮帮我
编辑:
抱歉,我没有添加一些示例,所以这里是:
1
a = sorted(a, key=lambda x: x.split("NR;")[-1].split[";"][0])
中的项目: b.append(re.search(“(; NR; [0-9] *;)”,str(item)))
基本上我尝试了以上和上面的一些变化,我无法完全记住我尝试过的所有代码。
答案 0 :(得分:3)
In [1]: a = ['jhfewrgjhdfjhgsufgssdfjgh;NR;3243;fgjdsgfjsdfkjgdf', 'dsafjhsafjkhefhajwejh;NR;123;dfgdsrhgjhdfgjhdsfjhg']
In [2]: a.sort(key=lambda x: x.split(';')[2])
In [3]: a
Out[3]:
['dsafjhsafjkhefhajwejh;NR;123;dfgdsrhgjhdfgjhdsfjhg',
'jhfewrgjhdfjhgsufgssdfjgh;NR;3243;fgjdsgfjsdfkjgdf']
正如下面的@EMS指出的那样,如果总有NR;
存在,则可以在NR;
上拆分并使用第一部分。
a.sort(key=lambda x: int(x.split("NR;")[-1].split(";")[0]))
按顺序对列表进行排序。如果您想创建列表副本(为其分配新变量),可以使用sorted
b = sorted(a, key=lambda x: int(x.split("NR;")[-1].split(";")[0]))
端至端:
# Includes an entry without the `;NR;`
In [1]: a = ['jhfewrgjhdfjhgsufgssdfjgh;NR;3243;fgjdsgfjsdfkjgdf', 'dsafjhsafjkhefhajwejh;NR;123;dfgdsrhgjhdfgjhdsfjhg', 'jhfewrgjhdfjhgsufgssdfjgh;fgjdsgfjsdfkjgdf']
# Remove any entry that doesn't have `;NR;` in it
In [2]: a = filter(lambda x: ';NR;' in x, a)
# Sort with an integer version of the number found (rather than the string)
In [3]: a.sort(key=lambda x: int(x.split("NR;")[-1].split(";")[0]))
In [4]: a
Out[4]:
['dsafjhsafjkhefhajwejh;NR;123;dfgdsrhgjhdfgjhdsfjhg',
'jhfewrgjhdfjhgsufgssdfjgh;NR;3243;fgjdsgfjsdfkjgdf']
答案 1 :(得分:0)
对列表进行排序始终接受'key'参数,您可以将任意函数作为键传递。在您的情况下,该函数应该执行以下操作:
这是执行此操作的一种方法
def func(st): # I am using your first string as a running example in this code
nr_part = st.split("NR;")[1] # returns "3243;fgjdsgfjsdfkjgdf"
int_part = nr_part.split(";")[0] # returns "3243"
return int(int_part)
现在,您可以分开包含“NR”的字符串;通过使用过滤器。
aa = filter(a, lambda x: "NR;" in x)
最后,对结果列表进行排序很简单
aa = ['jhfewrgjhdfjhgsufgssdfjgh;NR;3243;fgjdsgfjsdfkjgdf', 'dsafjhsafjkhefhajwejh;NR;123;dfgdsrhgjhdfgjhdsfjhg']
a.sort(a, key=func) # in place sorting
或者
sorted(a, key=func) # Return a new sorted list
一些警告:您必须确保您的假设为“NR;< int>”列表中的所有字符串都应该满足正则表达式,并且字符串的int部分不应该足够大,以便'int()'转换不会导致溢出。