我正在处理python中的问题,如果我有列表列表。看起来如下:
[[bob, masters, 1], [sheila, brown, 9], [jack,hardy,15], [bob, masters,
41], [mike,benson, 21], [jack, hardy, 100]]
我要完成的工作是将该列表列表转换为列表列表列表(不确定这是正确的术语)。所以我希望我的新列表或更改过的列表看起来像这样:
[[[bob, masters, 1],[bob, masters, 41]], [[sheila, brown, 9]],
[[jack,hardy,15], [jack, hardy, 100]],[[mike,benson, 21]]]
总而言之,我想在一个大列表内为每个人的列表创建一个列表。
我是python的新手,所以我不知道我能采取的最佳方法是什么。当我阅读每一行并将其添加到原始列表时,我使用split函数将其转换为我在顶部显示的列表。如果有人能指出正确的方向,那将会有所帮助。我不确定是否应该更改已经创建的列表,或者在我从文件中读取文本时更改创建列表的方式。 这是我当前拥有的代码,这些代码构成了列表列表:
f = open("input.txt", "r")
inputText = []
i = 0
# adds each line of input file to a list
for line in f:
inputText.insert(i, line.split())
i = i+1
任何帮助将不胜感激。谢谢。
答案 0 :(得分:0)
我将创建一个新列表并使用groupby函数:
import collections
def groupby(iterable, key_fn):
grouped = collections.defaultdict(list)
for item in iterable:
key = key_fn(item)
grouped[key].append(item)
return grouped
input_list = [['bob', 'masters', 1], ['sheila', 'brown', 9], ['jack','hardy',15], ['bob', 'masters',
41], ['mike','benson', 21], ['jack', 'hardy', 100]]
grouped = groupby(input_list, lambda item: item[0])
final_result = list(grouped.values())
print(final_result)
哪个输出
[[['bob', 'masters', 1], ['bob', 'masters', 41]], [['sheila', 'brown', 9]], [['jack', 'hardy', 15], ['jack', 'hardy', 100]], [['mike', 'benson', 21]]]
答案 1 :(得分:0)
假设您的输入文件如下所示:
bob masters 1
sheila brown 9
jack hardy 15
bob masters 41
mike benson 21
jack hardy 100
您可能想使用中介dict
:
data_dict = {}
with open("input.txt") as f:
for line in f:
first_name, last_name, number = line.split()
if not (first_name, last_name) in data_dict:
data_dict[(first_name, last_name)] = []
data_dict[(first_name, last_name)].append(number)
此时,data_dict
看起来像这样:
{('bob', 'masters'): ['1', '41'], ('sheila', 'brown'): ['9'], ('jack', 'hardy'): ['15', '100'], ('mike', 'benson'): ['21']}
您可以随时将其转换为所需的list
结构:
data_list = []
for (first_name, last_name), numbers in data_dict.items():
data_list.append([])
for number in numbers:
data_list[-1].append([first_name, last_name, number])
所以你有data_list
:
[[['bob', 'masters', '1'], ['bob', 'masters', '41']], [['sheila', 'brown', '9']], [['jack', 'hardy', '15'], ['jack', 'hardy', '100']], [['mike', 'benson', '21']]]