3

宿題では、2 つの入力 (リストと文字列) を受け取り、リストを返す関数を作成する必要がありました。リスト内包表記を使用してこの関数を書きたいのですが、厄介な問題が発生しています。これが私が書き直したい彼の元の関数です:

index = [['keyword1', ['url1', 'url2', 'url3']], ['keyword2', ['url4', 'url5']]...]

def lookup(index, keyword):
    result = []
    for entry in index:
        if entry[0] == keyword:
            result += entry[1]
    return result

これらは、リスト内包表記を使用する私の試みでした:

def lookup(index, keyword):
    return [entry[1] for entry in index if entry[0] == keyword]

def lookup(index, keyword):
    return [ulist for key, ulist in index if i == keyword]

そして最後に...

def lookup(index, keyword):
    return [j for j in (entry[1] for entry in index if entry[0] == keyword)]

ここでの問題は、次のように、リスト内のリストで目的の URL を返すことです。

[['url1', 'url2', 'url3']]

次の目的の形式の代わりに:

['url1', 'url2', 'url3']

私はちょうどこのようなことをすることを考えました(returnステートメントの最後に[0]を追加して、内部リストを取得します):

def lookup(index, keyword):
        return [j for j in (entry[1] for entry in index if entry[0] == keyword)][0]

しかし、それは正しい方法ではないようです。不必要にリスト内包表記を使用しようとしていますか (私の理解では、この状況はリスト内包表記に適しているということでした)。助言がありますか?

4

6 に答える 6

7

これが最も簡単な方法です。

def lookup(index,keyword):
    return [x for entry in index if entry[0]==keyword for x in entry[1]]

ネストされたリスト内包表記の構文は、最初に期待するものではありません。重要なのは、2つのforループの使用は、2つの別個のリスト内包ではなく、ネストされたループを持つ単一のリスト内包であることを理解することです。それが実際に機能する理由です。あなたが書いていたようなものです

for entry in index:
  if entry[0]==keyword:
    for x in entry[1]:
      yield x

リスト内包表記の順序は、生成された値が最初に来ることを除いて、通常のループの場合と同じです。

于 2012-05-06T02:02:55.183 に答える
3

代わりに辞書を使用する必要があります。そのAPIは、地図に関連することを話す(そしてすばやく処理する)のに自然に適しているからです。

keywordToUrl = {keyword1:(url1,url2,url3), keyword2:(url4,url5), ...}
keywordToUrl[keyword]
于 2012-05-06T02:02:21.327 に答える
1
def lookup(index, keyword):
    return sum((entry[1] for entry in index if entry[0] == keyword), [])

例:

>>> index = [['keyword1', ['url1', 'url2', 'url3']], ['keyword2', ['url4', 'url5']]]
>>> lookup(index, 'keyword1')
['url1', 'url2', 'url3']
于 2012-05-06T04:32:28.130 に答える
0

ご不便をおかけして申し訳ございません。私はすでにあなたのコードをテストしました、あなたがインデックスリストを見るならばあなたの値は均一ではありません:

index = [['keyword1', ('url1', 'url2', 'url3')], ['keyword2', ['url4', 'url5']]...]

ここindex[0][1]にタプルとindex[1][1]リストがあります。

インデックス内のリストの2番目の値をすべて作成すると、タプルは次のようになります。

これがあなたと同じコードです:

index = [["keyword1", ("url1", "url2", "url3")], ["keyword2", ("url4", "url5")]]
def lookup(index, keyword):
    return [entry[1] for entry in index if entry[0] == keyword]

print lookup(index,"keyword1")

そしてこれは出力です:

[('url1', 'url2', 'url3')]

これはリスト内のリストではないことに気付くでしょう。これにより、のすべての値index[i][1]がタプルになります。

この出力が必要な場合:

['url1', 'url2', 'url3']

そのタプルをリストに変換する必要がありますが、Pythonは自動的にリストを作成しません。公式ドキュメントで説明されているように、リスト内包表記は常にリストを返します。そのため、タプルはリスト内にあります。

http://www.python.org/dev/peps/pep-0202/

于 2012-05-06T02:31:00.113 に答える
0
def lookup(index,keyword):
    return [j for j in (entry[1] for entry in index if entry[0] == keyword)]

問題は、括弧内に何かを返しているため、値がリスト内に返されているため、括弧を削除して問題を解決することです。

これは正しいコードです。

def lookup(index,keyword):
    return j for j in (entry[1] for entry in index if entry[0] == keyword)
于 2012-05-06T01:54:15.247 に答える