J={'Sam': ['a', 'b', 'c'], 'Bil': ['d', 'e', 'f']}
这是如何打印元素的。
J['Sam'][1]
我上面有字典。程序提示用户输入。用户必须输入列表的第二个值,例如b
或e
或其他任何内容(但始终是第二个),因为这个词典实际上太大了。
所以我想在用户输入打印之前使用该元素。
e.g。如果用户输入b
,
我应该得到输出a
;
如果用户输入e
,
我应该得到输出d
。
我只是对操纵数据感到好奇。当然,我正在学习基础知识,我必须设计一个网络模拟器。所以这只是为此做好准备。
答案 0 :(得分:1)
让我们回到基础,因为不清楚你为什么要做你正在做的事情。
当您进行查找时,dict
是一个很棒的数据结构 - 在您的情况下,您可以执行J['Sam']
并获取与Sam相关联的值 - a { {1}}。它很快。凉。
当您必须迭代它时,list
是一个笨重的数据结构。它没有维持秩序。它无法索引到。这很慢。嘘声。
但让我们继续前进,让我们假设您的dict
必须采用该格式。没关系。请注意,您要求进行与J
设置不同的查找 - 给定一个键dict
,它之前的值是什么(某些列表中的某些列表,无论如何)。因此,一种方法是创建另一个具有所需查找的'b'
。
dict
简单易用:现在您可以使用这个新的{k:v for v,k,_ in J.values()} # in python 2, use J.itervalues() instead
Out[3]: {'b': 'a', 'e': 'd'}
来查找上一个元素。
但是如果您的第一个dict
是静态的,那么这只会干净利落地运作;如果你要改变它,你必须在进行每次查找之前不断更新这个查找字典。不是最好的。
您也可以在每次查找目标时运行所有值 - 假设您想要dict
之前的值。
'e'
这会在next
上使用generator expression,这会在第二个列表元素next(x for x,y,z in J.values() if y == 'e')
Out[5]: 'd'
时为我们提供第一个列表元素。关于== 'e'
的一个很酷的事情是,如果你的生成器表达式用尽了,你可以指定你想要的东西:
next
请注意,所有这些答案都使用tuple unpacking,这只是一种语法准确。我可以很容易地把底部的一个写成
next((a for a,b,c in J.values() if b == 'blah'), 'not found')
Out[6]: 'not found'
同样的,真的。
答案 1 :(得分:1)
这样的东西?
J = {'Sam': ['a', 'b', 'c'], 'Bil': ['d', 'e', 'f']}
def lookup(key, dictionary):
for value in dictionary.values(): #in Python2, use itervalues() instead
if key in value:
return value[value.index(key) - 1]
else:
print('key not found')
>>> lookup('e', J)
'd'
>>> lookup('c', J)
'b'
请注意,如果给定的键是第一个值,则此方法将返回最后一个值。
>>> lookup('a', J)
'c'
以上假设列表可能很长,并且想法是在列表中找到键前面的元素。
如果查找元素的位置始终相同:
def lookup(key, dictionary):
for value in dictionary.values(): #Python 2, use itervalues() instead
if key == value[1]:
return value[0]
else:
print('key not found')
用法:
>>> lookup('b', J)
'a'
>>> lookup('e', J)
'd'
>>> lookup('c', J)
key not found