Python 在字典中查找值更改和索引
我有一本大字典:Python 在字典中查找值更改和索引,python,list,dictionary,indexing,intersection,Python,List,Dictionary,Indexing,Intersection,我有一本大字典: exp_dict={0: {'length': 38.63999999999999, 'line_nm': [['Hammersmith & City_1'], ['Hammersmith & City_1'], ['Hammersmith & City_1'], ['Metropolitan_1', 'Hammersmith & City_1'], ['Metropolitan_1', 'Hammersmi
exp_dict={0: {'length': 38.63999999999999,
'line_nm': [['Hammersmith & City_1'],
['Hammersmith & City_1'],
['Hammersmith & City_1'],
['Metropolitan_1', 'Hammersmith & City_1'],
['Metropolitan_1', 'Hammersmith & City_1'],
['Metropolitan_1', 'Hammersmith & City_1'],
['Metropolitan_1', 'Hammersmith & City_1'],
['Metropolitan_1', 'Hammersmith & City_1'],
['Metropolitan_1', 'Hammersmith & City_1'],
['Metropolitan_1', 'Hammersmith & City_1'],
['Metropolitan_1'],
['Metropolitan_1'],
['Metropolitan_1'],
['Metropolitan_1', 'Hammersmith & City_1'],
['Metropolitan_1', 'Hammersmith & City_1'],
['Hammersmith & City_1'],
['Hammersmith & City_1'],
['Central', 'Hammersmith & City_1'],
['Central']]},
1:{'length':100,
'line_nm':[
['Bakerloo'],
['Bakerloo'],
['Central'],
['Central'],
['Central'],
['Northern'],
['Northern'],
['Northern']
]
}}
我想找出每个“直线”部分的值变化(交点)及其索引
例如,我想知道关于dict['1']
:
在
线路改变了
['Metropolitan_1']
它与
dict['1']['line_nm'][0]
在
dict['1']['line_nm'][15]
这条线是['Metropolitan\u 1']
,它与索引10中先前的['Metropolitan\u 1']
没有交叉点
我需要知道所有的索引
目前我只能通过以下方式查看是否有任何变化:
for key,value in dict.items():
if set(value['line_nm'][0]).intersection(*value['line_nm'])==set([]):
print key,True
以下是一些想法:
- 不要将
用作变量名,因为它已作为内置项存在。使用dict
(或其他名称)dict.
- 在诸如“==”和“=”(一个很好的资源:)之类的操作符周围包含空格是更好的Python风格
- 您可能会从您的用例中受益
d
,其中d
的键是dict
的键,d
的值是元组列表。元组包含嵌套列表中列表值的索引,以及基于问题中概述的参数的列表值本身
d = {}
for k,v in dict_.items():
d[k] = []
ind = v['line_nm'][0]
for i, j in enumerate(v['line_nm']):
if not any(x in j for x in ind):
d[k].append((i, v['line_nm'][i]))
ind = v['line_nm'][i]
print d
# output:
# {0: [(10, ['Metropolitan_1'])],
# 1: [(5, ['Metropolitan_1']), (10, ['Central', 'Hammersmith & City_1'])]}
编辑
上述代码为exp\u dict
生成此输出:
# output:
# {0: [(10, ['Metropolitan_1']),
# (15, ['Hammersmith & City_1']),
# (18, ['Central'])],
# 1: [(2, ['Central']),
# (5, ['Northern'])]}
如果只需要相关索引,请使用以下代码:
d = {}
for k,v in exp_dict.items():
d[k] = []
ind = v['line_nm'][0]
for i, j in enumerate(v['line_nm']):
if not any(x in j for x in ind):
d[k].append(i)
ind = v['line_nm'][i]
print d
# which outputs the following for exp_dict:
# {0: [10, 15, 18],
# 1: [2, 5]}
我很难理解你到底想做什么。是否要比较嵌套列表中元素的交点?对于每个嵌套字典,您是否只关心索引5与索引0的交集,以及索引10与索引5的交集?我想比较列表中的每个元素,找到第一个元素(比如索引=a)与列表[0]不交集,然后找到下一个元素与列表[index=a]不交集。谢谢,请重新阅读我的帖子?我做了一些更改,所以您的代码可能无法正常工作(它遗漏了与[0]具有相同行但与[15]不相同的15)。关键是,如果你沿着['line_nm']列表走,你必须换一个新名字,我想找出改变点的索引;感谢您的编辑-我已经编辑了我的答案,包括基于您新的
exp\u dict
的输出。很高兴能为您提供更多帮助。谢谢您的帮助~您能解释一下代码中的“ind”部分吗?它是如何工作的?如果出现任何新的变化(与以前的一个旧名称相同),这会起作用吗?抱歉问了这么多问题。我很高兴;很高兴解释,我只是邀请你去聊天室,这样我们可以继续聊天。不用担心问题。嗨,丹尼尔,我可能会错过邀请。如何开始聊天?
d = {}
for k,v in exp_dict.items():
d[k] = []
ind = v['line_nm'][0]
for i, j in enumerate(v['line_nm']):
if not any(x in j for x in ind):
d[k].append(i)
ind = v['line_nm'][i]
print d
# which outputs the following for exp_dict:
# {0: [10, 15, 18],
# 1: [2, 5]}