3

操作したいタプルのリストを宣言しました。ユーザーからのオプションを返す関数があります。ユーザーがキー「A」、「W」、「K」のいずれかを入力したかどうかを確認したいと思います。辞書を引くと、次のようになりますwhile option not in author.items() option = get_option()。タプルのリストでこれを達成するにはどうすればよいですか?

authors = [('A', "Aho"), ('W', "Weinberger"), ('K', "Kernighan")]
4

3 に答える 3

2
authors = [('A', "Aho"), ('W', "Weinberger"), ('K', "Kernighan")]
option = get_option()
while option not in (x[0] for x in authors):
    option = get_option()

これがどのように機能するか:

(x[0] for x in authors)はジェネレータ式です。これにより、[0]th各項目の要素が作成者リストから 1 つずつ生成され、その要素がoption. 一致が見つかるとすぐに、短絡して終了します。

ジェネレータ式は一度に 1 つの項目を生成するため、メモリ効率が高くなります。

于 2013-06-19T23:54:17.507 に答える
1

のようなものはどうですか

option in zip(*authors)[0]

zip基本的に文字を単語から分離するために使用しています。それにもかかわらず、タプルのリストを扱っているため、以下を使用してアンパック*する必要があります。

>>> zip(*authors)
[('A', 'W', 'K'), ('Aho', 'Weinberger', 'Kernighan')]
>>> zip(*authors)[0]
('A', 'W', 'K')

次にoption in、オプションが に含まれているかどうかをテストするために使用しますzip(*authors)[0]

于 2013-06-19T23:45:55.323 に答える
0

でこの操作を行うことをカバーする良い答えがここにありますがzip、そのようにする必要はありません-代わりにを使用できますOrderedDict

from collections import OrderedDict
authors = OrderedDict([('A', "Aho"), ('W', "Weinberger"), ('K', "Kernighan")])

エントリの順序が記憶されているため、キーの奇妙または異常な順序になることを恐れずに反復できます。

于 2013-06-20T00:20:41.543 に答える