在Python中通过迭代重构列表列表

时间:2017-09-25 18:16:29

标签: python

我有一个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][]不正确,访问它的正确方法是什么?

2 个答案:

答案 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)