2016-09-11 23 views
1

リストのリスト内の値を検索して置換したいと考えています。私の現在のコードは、しかし、私はそれはそれはする必要がありますその後、より複雑だと感じる作品ネストされたリスト内の値を検索して置換する方法

  1. Flatten a nested list
  2. Search for and replace a value
  3. Regroup the flat list into a list of lists

:私はに一緒に答えを石畳ました。これを行うよりエレガントな方法はありますか?

# Create test data- a list of lists which each contain 2 items 
numbers = list(range(10)) 
list_of_lists = [numbers[i:i+2] for i in range(0, len(numbers), 2)] 

# Flatten the list of lists 
flat_list = [item for sublist in list_of_lists for item in sublist] 
# Search for and replace values 
modified_list = [-1 if e > 5 else e for e in flat_list] 
# Regroup into a list of lists 
regrouped_list_of_lists = [modified_list[i:i+2] for i in range(0, len(modified_list), 2)] 
+0

これは、おそらく最もPythonicな方法です。それが動作し、読み取り可能な場合は、修正しないでください! – TheLazyScripter

+0

@TheLazyScripter *動作して読み込みが可能な場合は、修正しないでください*この場合はNahです。 –

答えて

2

を平らにし、再編成することなく、ネストされたリストの内包におけるサブリストでの置換を行います。

numbers = list(range(10)) 
list_of_lists = [numbers[i:i+2] for i in range(0, len(numbers), 2)] 
# here 
list_of_lists = [[-1 if e > 5 else e for e in sublist] for sublist in list_of_lists] 
2

あなたはすでにちょうどそれらを組み合わせて、リストの内包表記を使用している:

replaced_list_of_lists = [ 
      [-1 if e > 5 else e for e in inner_list] 
       for inner_list in list_of_lists 
     ] 
+0

これは良い答えだとは分かりません。リストの理解はすでに読みやすさに多くを追加し、それらを組み合わせることはあまり役に立ちません。 –

+0

これは間違いなくコードのいくつかを削除していますが、私は個人的にリストの理解を重視することを避けようとしています。 –

+0

@AntoineBolvyしかし、元のリストの形式を正確に知っていれば、フラッティング/置換/再結合の元のソリューションが機能します。一般的な解決策が必要な場合は、リスト内包またはネストされたforループのいずれかが必要です。 –

関連する問題