扫描列表中的列表

时间:2014-01-26 23:23:57

标签: python

J={'Sam': ['a', 'b', 'c'], 'Bil': ['d', 'e', 'f']}

这是如何打印元素的。

J['Sam'][1]

我上面有字典。程序提示用户输入。用户必须输入列表的第二个值,例如be或其他任何内容(但始终是第二个),因为这个词典实际上太大了。

所以我想在用户输入打印之前使用该元素。

e.g。如果用户输入b,   我应该得到输出a;      如果用户输入e,   我应该得到输出d

我只是对操纵数据感到好奇。当然,我正在学习基础知识,我必须设计一个网络模拟器。所以这只是为此做好准备。

2 个答案:

答案 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