2017-09-25 117 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']] 

我第一次尝试unioning集,但创建一个大名单,我需要列出的名单。因此,我的计划是(1)创建一个新的空列表, (2)遍历列表的原始列表, (3)检查第二个元素(即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)