Python:附加到字典中的列表
所以 有个星期一的案子,我的推荐人都帮不了我 我有一个格式如下的文件:Python:附加到字典中的列表,python,Python,所以 有个星期一的案子,我的推荐人都帮不了我 我有一个格式如下的文件: x1 y1 z1 x1 y2 z2 x2 y3 z3 def makeKeyValuePair(tokens): return tokens[0], tokens[1:] print dict(makeKeyValuePair(line.rstrip().split()) for line in fileObject) 我想制作一个如下格式的字典:{x1:[[y1,z1],[
x1 y1 z1
x1 y2 z2
x2 y3 z3
def makeKeyValuePair(tokens):
return tokens[0], tokens[1:]
print dict(makeKeyValuePair(line.rstrip().split()) for line in fileObject)
我想制作一个如下格式的字典:{x1:[[y1,z1],[y2,z2]],x2:[y3,z3]}但我一直在寻找一种有效的方法来实现这一点。帮助?您可以这样做:
x1 y1 z1
x1 y2 z2
x2 y3 z3
def makeKeyValuePair(tokens):
return tokens[0], tokens[1:]
print dict(makeKeyValuePair(line.rstrip().split()) for line in fileObject)
它从键值对创建一个字典,然后从每一行提取键值对。当然,这假设x1、y1等不包含空格
正如delnan指出的,根据您的用例,您可能会遇到重复键的情况。这意味着您只能从带有该键的最后一行中获取值。要解决这个问题,可以使用defaultdict
:
from collections import defaultdict
d = defaultdict(list)
for line in fileObject:
tokens = line.rstrip().split()
d[tokens[0]].append(tokens[1:])
你可以这样做:
x1 y1 z1
x1 y2 z2
x2 y3 z3
def makeKeyValuePair(tokens):
return tokens[0], tokens[1:]
print dict(makeKeyValuePair(line.rstrip().split()) for line in fileObject)
它从键值对创建一个字典,然后从每一行提取键值对。当然,这假设x1、y1等不包含空格
正如delnan指出的,根据您的用例,您可能会遇到重复键的情况。这意味着您只能从带有该键的最后一行中获取值。要解决这个问题,可以使用defaultdict
:
from collections import defaultdict
d = defaultdict(list)
for line in fileObject:
tokens = line.rstrip().split()
d[tokens[0]].append(tokens[1:])
我要说你从一根绳子开始
data_str = """x1 y1 z1
x1 y2 z2
x2 y3 z3"""
那你就有
data_list = [d.split() for d in data_str.splitlines()] # [['x1', 'y1', 'z1'], ['x1', 'y2', 'z2'], ['x2', 'y3', 'z3']]
然后创建一个defaultdict
from collections import defaultdict
data_dict = defaultdict(list)
for data_row in data_list: # E.g., data_row = ['x1', 'y1', 'z1']
data_dict[data_row[0]].append(data_row[1:])
print data_dict # defaultdict(<type 'list'>, {'x2': [['y3', 'z3']], 'x1': [['y1', 'z1'], ['y2', 'z2']]})
从集合导入defaultdict
数据目录=默认目录(列表)
对于数据列表中的数据行:#例如,数据行=['x1',y1',z1']
数据目录[数据行[0]]。追加(数据行[1:])
打印数据dict#defaultdict(,{x2':[[y3',z3']],'x1':[[y1',z1'],[y2',z2']})
我想说你从一个字符串开始
data_str = """x1 y1 z1
x1 y2 z2
x2 y3 z3"""
那你就有
data_list = [d.split() for d in data_str.splitlines()] # [['x1', 'y1', 'z1'], ['x1', 'y2', 'z2'], ['x2', 'y3', 'z3']]
然后创建一个defaultdict
from collections import defaultdict
data_dict = defaultdict(list)
for data_row in data_list: # E.g., data_row = ['x1', 'y1', 'z1']
data_dict[data_row[0]].append(data_row[1:])
print data_dict # defaultdict(<type 'list'>, {'x2': [['y3', 'z3']], 'x1': [['y1', 'z1'], ['y2', 'z2']]})
从集合导入defaultdict
数据目录=默认目录(列表)
对于数据列表中的数据行:#例如,数据行=['x1',y1',z1']
数据目录[数据行[0]]。追加(数据行[1:])
打印数据dict#defaultdict(,{x2':[[y3',z3']],'x1':[[y1',z1'],[y2',z2']})
您可以执行以下操作:
result = { }
for line in lines:
terms = line.split()
result.setdefault(terms[0], []).append(terms[1:])
您可以这样做:
result = { }
for line in lines:
terms = line.split()
result.setdefault(terms[0], []).append(terms[1:])
您不需要附加到映射。附加到(可变)序列。不要把你的收藏搞混;)您不需要附加到映射。附加到(可变)序列。不要把你的收藏搞混;)否,如果该键出现多次,则会覆盖列表。你需要一个
defaultdict
@delnan:Unique key是我做的另一个假设。。。我将编辑以包含defaultdict
解决方案。在OP的示例中,唯一键显然不是这种情况;)否,如果该键出现多次,则会覆盖列表。你需要一个defaultdict
@delnan:Unique key是我做的另一个假设。。。我将编辑以包含defaultdict
解决方案。在OP的示例中,唯一键显然不是这种情况;)这与AndiDog的答案有着同样的问题:它会覆盖重复的条目。@delnan显然不是唯一一个明显带有周一坏案例的作者。现在,这是一个穷人对集合的重新创造。defaultdict
;)@德尔南不知道这件事。你每天都会学到一些东西:)这和AndiDog的答案有着同样的问题:它会覆盖重复的条目。@delnan显然,作者不是唯一一个明显有周一坏案例的人。现在,这是一个穷人对集合的重新创造。defaultdict
;)@德尔南不知道这件事。您每天都会学到一些东西:)+1表示整个解决方案,并一次就把它做好;)在Python3中,您还可以使用作为键,数据列表中的*value
(iterable unpacking,非常整洁),无法指定键元素和值元素之间的差异有点难看,python3带来的好处允许在解包iterables时使用解包函数参数的符号。+1表示整个解决方案,一次就搞定;)在python3中,您还可以对key使用,data_list中的*values
(iterable unpacking,非常简洁)。是的,不能指定key和value元素之间的差异有点难看,python3带来的好处允许在解包iterables时使用解包函数参数的表示法。