2017-09-25 9 views
2

私は2Dリストまたはリストのリストを持っています。新しいリストを作成することですリストのリストをPythonの反復で再構成します

[['A', '58.76-65.9'], ['B', '58.76-65.9'], ['C', '58.76-65.9'], ['A', '24.8-62.8']] 

私の目的を返す

with open("Input.txt", "r") as file: 
    raw = [[str(x) for x in line.split()] for line in file] 

print (raw) 

入力ファイルは、私はその後、リストのリストを作成し

A  58.76-65.9 
B  58.76-65.9 
C  58.76-65.9 
A  24.8-62.8 

です新しい構造のリストを作成する。このようなリットの新しいリストを入手するにはどうすればいいですか?

[['58.76-65.9', 'A', 'B', 'C'], ['A', '24.8-62.8']] 

私が最初に合併するセットを試してみましたが、それは一つの大きなリストを作成し、私はリストのリストを必要としています。したがって、私の計画は、(1)リストの新しい空リストを作成することです。 (2)リストの元のリストを反復します。 (3)新しいリストのリストに2番目の要素(58.76-65.9)が存在するかどうかを確認します。リスト。そうでない場合は、両方の要素を拡張します。それがない場合は、単に最初の要素(すなわちA)は

# Defining empty list 
matches=[] 
# Accesing each row in the 2d list 
for r in raw: 
    if r[1] not in matches[0][]: 
     matches.append([r[1], r[0]]) 

私はmatches[0][]が正しくないことを認識し、それをアクセスするための正しい方法は何ですか?

答えて

3

は、グループ化イディオムを使用します。

>>> data = [['A', '58.76-65.9'], ['B', '58.76-65.9'], ['C', '58.76-65.9'], ['A', '24.8-62.8']] 
>>> from collections import defaultdict 
>>> grouper = defaultdict(list) 
>>> for x, y in data: 
...  grouper[y].append(x) 
... 
>>> grouper 
defaultdict(<class 'list'>, {'24.8-62.8': ['A'], '58.76-65.9': ['A', 'B', 'C']}) 

は今、私は正直に上記のデータ構造がはるかに実用的だと思いますが、あなたが本当にしたい場合は、簡単にリストの-リストに変換することができます:

>>> [[k] + v for k, v in grouper.items()] 
[['24.8-62.8', 'A'], ['58.76-65.9', 'A', 'B', 'C']] 

、あるいはよりよい:

>>> [[k, *v] for k, v in grouper.items()] 
[['24.8-62.8', 'A'], ['58.76-65.9', 'A', 'B', 'C']] 
0

ただ、辞書データ構造を使用します。それはあなたが望むものです:

# Load data: 
my_array = [[1 , 10], [2, 10], [3, 20]] 
# Result as a dictionary: 
result = {} 
# Loop over data: 
for value, key in my_array: 
    if key not in result: 
    # Create new list 
    result[key]=[] 
    result[key].append(value) 
# If you really need a list of lists as output, do something like: 
result_l = [list(elem) for elem in result.items()] 
# (in python3) 
関連する問題