2014-04-25 78 views
0

我需要的排序是定义sort_by_level(成绩册)在成绩簿内从第一最低数量

sort_by_level(gb) 

[('CS1010S', 'A+'), ('MA1101R', 'C'), ('SSA1207', 'B+'), ('CS2020', 'A')] 

排序的第一个数字。例如,'CS1010S'的第一个数字是'1'。 对我来说,棘手的部分是'SSA1207',其中第一个数字在第四个位置是1。

我的助手:

def getting_code(module): 
    for i in range(len(module)): 
     if module[i] in [ "1","2","3","4","5","6","7","8","9","0"]: 
      return module[i] 

非常感谢!

编辑:我的问题与其他问题略有不同,因为我期望通过使用例如:MODULE [0]中的FIRST NUMBER与其他使用Grades排序的其他方法进行比较,例如:A/B/C

+1

提示:使用're'模块'排序(list,keys = )' –

+1

在过去的一周里,同样的作业已经被问过几次。尝试搜索一下。祝你好运! – devnull

+0

@devnull谢谢! – user3251511

回答

1

通过使用next()isdigit()检查,您可以从字符串中获得第一个数字。

然后,使用sorted()用自定义key功能,你在列表中提取第一位出每个元组的第一个项目的字符串:

def sort_by_level(gb): 
    return sorted(gb, key=lambda x: int(next(i for i in x[0] if i.isdigit()))) 

data = [('CS1010S', 'A+'), ('MA1101R', 'C'), ('SSA1207', 'B+'), ('CS2020', 'A')] 
print sort_by_level(data) 

打印:

[('CS1010S', 'A+'), 
('MA1101R', 'C'), 
('SSA1207', 'B+'), 
('CS2020', 'A')] 
0

您可以使用像这样的正则表达式

my_list=[('CS1010S', 'A+'), ('MA1101R', 'C'), ('SSA1207', 'B+'), ('CS2020', 'A')] 
import re 
print sorted(my_list, key=lambda (item, _): int(re.search(r"\d", item).group())) 
# [('CS1010S', 'A+'), ('MA1101R', 'C'), ('SSA1207', 'B+'), ('CS2020', 'A')] 
0

使用a for循环并检查每个条目是否使用内置的str.isdigit()

>>> string = 'SSA1207' 
>>> for k in string: 
...  if k.isdigit() == True: 
...    print 'The first digit is:', k 
...    break 
... 
The first digit is: 1 
>>> 
2

您可以记住的钥匙,防止第一位数的计算多次:

grades = [('CS1010S', 'A+'), ('MA1101R', 'C'), 
      ('SSA1207', 'B+'), ('CS2020', 'A')] 
grades = [(int(filter(lambda x: x.isdigit(), g[0])[0]), g) for g in grades ] 
print sorted(grades) 

给出:

[(1, ('CS1010S', 'A+')), (1, ('MA1101R', 'C')), 
     (1, ('SSA1207', 'B+')), (2, ('CS2020', 'A'))]