通过Python中的迭代重构列表列表
问题描述:
我有一个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][]
是不正确的,什么是访问它的正确方法?
答
使用分组成语:
>>> 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']]
答
只需使用字典的数据结构。它的确如此,你想要什么:
# 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)