2016-06-29 5 views
4

私はこのようになりますリストがあります:リストの理解中のリストの値の型を調べる前に値を繰り返しますか?

test = [[1,11],[2,22],3.0] 

をし、私はこのようなことから、各ペアの最初の値のリストを作成したい:私はこの結果を得るように

[f for [f,l] in test] 

[1,2] 

しかし、予想通り、私はこのエラーを取得する:

TypeError: 'float' object is not iterable 

だから私はこのようにそれを修正しようとしました:

[f for [f,l] in test if type([f,l]) != float] 

と、私はまだ同じエラーを取得:

TypeError: 'float' object is not iterable 

どのように私はリスト内包内のリストで値の種類をテストしますの前に、の中の項目を繰り返し処理しますか?

答えて

3

この場合は、タイプを確認するために完全なアイテムが必要なので、アンパックを早く行うことはできません。

>>> test = [[1,11],[2,22],3.0] 
>>> [item[0] for item in test if isinstance(item, list)] 
[1, 2] 

あなたがアイテムを見てする機会を持って前に、あなたはTypeErrorで終わることができますので、種類を見てチャンスを持っている前に、あなたがそれをやっていた方法(for a, b in iterable)がアンパックをしようとします。

あなたは本当にあなたが行くように、あなたが最初のテストITESMをフィルタリングして、フィルタリングされたデータに、あなたのリスト内包を書くことができ開梱好きなら...

>>> test_iterables = (item for item in test if isinstance(item, list)) 
>>> [f for f, l in test_iterables] 

はまたに応じていることに注意してくださいあなたのリストが非一致標準が含まれているので、あなたがサポートしたいどのような種類、あなたのアンパックが動作しない
isinstance(item, collections.Sequence)またはisinstance(item, collections.Iterable)

+0

は、私の今削除されたコメントを無視:それは関係のない問題でした。これは機能します。 – rosstripi

0

を行うには良いかもしれませんes。

>>> test = [[1,11],[2,22],3.0] 
>>> [i[0] for i in test if hasattr(i, '__len__')] 
[1, 2] 
2
test = [[1,11],[2,22],3.0] 

print([f for [f,l] in filter(lambda x: type(x) is list, test)]) 

[1, 2]

0

あなたは単純なアプローチを試すことができます: あなたは、単に(この場合は)それだけであなたのリストを与えhasattrにフィルタリングすることができますが、属性__len__とインデックスリストの最初の項目がありますこのような:

test = [[1,11],[2,22],3.0] 

test_copy = test[:] 

for num in test: 
    if type(num) != list: 
     test_copy.remove(num) 
else: 
    print([num[0] for num in test_copy]) 

出力:

あなたがしたい場合にも、これで最後の行を置き換えることができます

print(list(map(lambda x: x[0], test_copy))) 
関連する問題