2017-04-12 53 views
3

我想通过使用list-comprehentions在单行中编写一个4-5行代码。但这里的问题是,我不能使用插入功能,所以即时通讯想知道是否有解决这个问题的方法?python插入函数列表comprehentions

原始代码:

def order(text): 
    text = text.split() 
    for x in text: 
     for y in x: 
      if y in ('1','2','3','4','5','6','7','8','9'): 
       final.insert(int(y)-1, x) 

    return final 

是我迄今为止尝试:

return [insert(int(y)-1, x) for x in text.split() for y in x if y in ('1','2','3','4','5','6','7','8','9')] 

但我已经遇到了以下错误:
NameError:全局名称 '插入' 没有定义

我试图使用insert因为任务是使用每个单词中显示的数字重新排列列表中的项目。

,比如我有is2 Th1is T4est 3a作为输入,它应该站出来为:
Th1is is2 3a T4est

+3

没有插入功能。 'final.insert'是一个*方法*,并且不显示实际是什么'final'(大概是一个列表)。还要注意,你不应该使用列表解析的副作用 - 'list.insert'返回'None',我怀疑你想要的列表。 – jonrsharpe

+1

1.什么是'final'? 2.列举解释_build list-on-the-fly_,所以你现在正在考虑将字段插入_nowhere_,因为还没有创建列表。 3.是的,没有标准函数称为“插入”,为什么你期望它存在呢? – ForceBru

+0

@ForceBru Final是我在原始代码中使用的列表。有没有办法为这种列表理解运行该表达式?像“自插入” –

回答

4

而不是使用列表理解的,你应该只sort在关键函数中使用这些号码列表,例如使用正则表达式提取数字。

>>> import re 
>>> s = "is2 Th1is T4est 3a" 
>>> p = re.compile("\d+") 
>>> sorted(s.split(), key=lambda x: int(p.search(x).group())) 
['Th1is', 'is2', '3a', 'T4est'] 
+0

西部最快的枪!愚蠢的我,我仍然在为你写一个完全相同的代码的解释。做得好! –

+1

你也可以使用'int(filter(str.isdigit,x))'而不是正则表达式。如果你想支持Python 3,你必须使用'''.join()'。 – Blender

1

您可以通过拆分代码成几个简单的功能实现您最初的想法,并作出适当的大小(充满None S)的列表来保存的话,最终的排序:

def extract_number(text): 
    return int(''.join(c for c in text if c.isdigit())) 

def order(text): 
    words = text.split() 
    result = [None] * len(words) 

    for word in words: 
     result[extract_number(word) - 1] = word 

    return ' '.join(result) 

您也可以使用sorted()做到这一点的一条线:

def extract_number(text): 
    return int(''.join(c for c in text if c.isdigit())) 

def order(text): 
    return ' '.join(sorted(text.split(), key=extract_number))