Python 将三个不同的列表配对
我有以下的口述:Python 将三个不同的列表配对,python,python-3.x,list,Python,Python 3.x,List,我有以下的口述: authorvals= [ { "author": "author1", "year": [ "2016" ], "value1": 4.0 }, { "author&q
authorvals= [
{
"author": "author1",
"year": [
"2016"
],
"value1": 4.0
},
{
"author": "author2",
"year": [
"2016"
],
"value1": 2.0
},
{
"author": "author1",
"year": [
"2016"
],
"value3": 1.0
},
{
"author": "author1",
"year": [
"2016"
],
"value2": 4.0
},
{
"author": "author2",
"year": [
"2016"
],
"value2": 2.0
}]
现在我想从这篇文章中列出如下内容:
val_list=["value1","value2","value3"]
num_list=[[4,2],[4,2],[1,0]]
auth_list=["author1","author2"]
我想把这条口述分成三份单独的清单
num_list=[]
auth_list=[]
val_list=[]
for item in authors_dict:
if item['author'] not in auth_list:
auth_list.append(item['author'])
for k in item.keys():
if k.startswith("value") and k not in val_list:
val_list.append(k)
val_list.sort()
for v in val_list:
temp_val_list = []
for i in authors_dict:
try:
val = i[v]
temp_val_list.append(val)
except:
pass
if len(temp_val_list) > 0:
num_list.append(temp_val_list)
print(val_list)
print(num_list)
print(auth_list)
但这不是我想要完成的
num_列表的最后一个列表中的0是因为author2没有值。如果没有值,则应打印0
(
['author2', 'author1'],
['value1', 'value3', 'value2'],
[[4, 2], [1, 0], [4, 2]]
)
有两件事我不太清楚,所以我做了一些假设:
num_列表中添加零
val_list=[]
num_list=[]
auth_list=[]
max_values = 0
for d in authorvals:
if d["author"] not in auth_list:
auth_list.append(d["author"])
for key in d:
if key.startswith("value"):
if key not in val_list:
val_list.append(key)
num_list.append([d[key]])
max_values = max(max_values, 1)
else:
idx = val_list.index(key)
num_list[idx].append(d[key])
max_values = max(max_values, len(num_list[idx]))
for sublist in num_list:
if len(sublist) != max_values:
padding = [0] * (max_values - len(sublist))
sublist.extend(padding)
print(val_list) # ['value1', 'value3', 'value2']
print(num_list) # [[4.0, 2.0], [1.0, 0], [4.0, 2.0]]
print(auth_list) # ['author1', 'author2']
auth_list=set([x['author']代表authorvals中的x])#如果您需要通过索引访问它,您可以将类型强制转换为list
索引={}#便于表示
对于authorvals中的身份验证:
keys=auth.keys()
过滤=键。uuuu sub_uuuuuuuuuu(['author','year'])。uuu iter_uuuuuuuuuuuu()。uuuuuuu next_uuuuuuu()。#从键列表中删除'author'和'year'键,并获取第一个值
如果indexed.get(filtered)为None:
索引[筛选]=[]#如果找不到相同的键名,则初始化
索引[filtered]。追加(auth[filtered])#将迭代中的值追加到相应的索引中
val_list=list(index.keys())
num_list=[索引[键]用于val_list中的键]
请注意,
num\u列表
可能有所不同,因为每个成员的对数没有提供的示例中所示的固定成员数,但您始终可以在之后处理它们filtered=keys.。\uuuu sub\uuuuuuu(['author','year'])[0]#从键列表TypeError中删除“author”和“year”键:“set”对象不可订阅@darkash我得到了这个error@Sam我已经修改了答案,应该能够立即运行。不保证项目以“值”开头。这只是一个示例。它可以是数据、流程或其他任何内容@kluvin@Sam,请参阅修订后的答案。我担心排序可能会有问题,因为字典通常不能保证这一点。编辑:,看起来这不是问题:)不保证项目以“值”开头。这只是一个示例。它可以是数据、流程或任何其他@Saad Hussain
val_list=[]
num_list=[]
auth_list=[]
max_values = 0
for d in authorvals:
if d["author"] not in auth_list:
auth_list.append(d["author"])
for key in d:
if key.startswith("value"):
if key not in val_list:
val_list.append(key)
num_list.append([d[key]])
max_values = max(max_values, 1)
else:
idx = val_list.index(key)
num_list[idx].append(d[key])
max_values = max(max_values, len(num_list[idx]))
for sublist in num_list:
if len(sublist) != max_values:
padding = [0] * (max_values - len(sublist))
sublist.extend(padding)
print(val_list) # ['value1', 'value3', 'value2']
print(num_list) # [[4.0, 2.0], [1.0, 0], [4.0, 2.0]]
print(auth_list) # ['author1', 'author2']