我有一个2D列表或列表列表。
输入文件是
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)检查新列表列表中是否存在第二个元素(即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][]
不正确,访问它的正确方法是什么?
答案 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']]
答案 1 :(得分: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)