2017-04-12 16 views
3

私はlist-comprehentionsを使用して1行に4-5行のコードを書き込もうとしています。しかし、ここでの問題は、私はインサートファンクションを使用することができないので、これに対して回避策があるかどうか疑問に思っていますか?python insert function list 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:グローバル名 'インサートは' が定義されていません

私はインサートこれは、各単語に表示される番号を使用してリスト内の項目を並べ替えることにあります。あなたのすべき重要な機能でこれらの数字を使用してちょうどsortリスト、例えば、代わりにリストの内包表記を使用しての
Th1is is2 3a T4est

+3

には、インサート機能はありません。 'final.insert'は* method *であり、あなたは' final'が実際に何であるかを表示しません(リスト、おそらく)。また、副作用のためにリスト内包を使うべきではないことにも注意してください。 'list.insert'は' None'を返します。 – jonrsharpe

+1

1.「最終」とは何ですか? 2.リスト内包表記_buildはオンザフライでリストに載っているので、まだリストが作成されていないので、文字通り「挿入」することを考えています。 3.はい、標準的な関数は 'insert'と呼ばれていませんが、どうしてそれはとにかく存在すると思いますか? – ForceBru

+0

@ForceBru Finalは、元のコードで使用したリストです。このようなリストのコンパクションのためにその式を実行する方法はありますか? –

答えて

4

例えば

私は、入力としてis2 Th1is T4est 3a持っており、それはとして出てくるはずです正規表現を使用して数字を抽出します。

>>> 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秒で埋め)適切なサイズのリストを作ることができます。

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()を使用して1行で行うことができます。

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))