在Python中测试列表成员资格并同时获取索引

时间:2011-10-07 04:27:52

标签: python list indexing idioms

写下面的内容似乎很愚蠢:

L = []

if x in L:
  L[x] = something
else:
  L[x] = something_else

这不是两次执行x的查找吗?我尝试使用index(),但是在找不到值时会出错。

理想情况下我想说:

if x is in L, save that index and:
  ...

我可以理解这可能是一个初学者的python习语,但似乎相当不可搜索。感谢。

4 个答案:

答案 0 :(得分:2)

您的意思是想要setdefault(key[, default])

a = {}
a['foo'] # KeyError
a.setdefault('foo', 'bar') # key not exist, set a['foo'] = 'bar'
a.setdefault('foo', 'x') # key exist, return 'bar'

答案 1 :(得分:2)

另一个选择是try / except:

d = {}
try:
    d[x] = something_else
except KeyError:
    d[x] = something

与您的代码相同。

编辑:好的,快速移动的目标。列表的相同习惯用法,不同的异常(IndexError)。

答案 2 :(得分:1)

如果你有一个列表,你可以使用index,如果它被抛出则捕获ValueError

yourList = []
try:
    i = yourList.index(x)
except ValueError:
    i = None

然后你可以测试i的值:

if i is not None:
    # Do things if the item was found.

答案 3 :(得分:0)

我认为你的问题很多,因为你在dict和list之间混合了你的语法。 如果:

L = []  # L is synonym for list and [] (braces) used to create list()

在这里,您要查找列表中的值,键或dict中的值:

if x in L: 

然后你使用 x 看似有意作为键,但是在列表中它是一个int()索引并且执行if x in L:不会测试索引是否在L中但是如果值在L:

L[x]=value

因此,如果您打算查看某个值是否在L列表中,请执行以下操作:

L = []                # that's a list and empty; and x will NEVER be in an empty list.
if x in L:            # that looks for value in list; not index in list
                      # to test for an index in a list do if len(L)>=x
   idx = L.index(x)
   L[idx] = something   # that makes L[index]=value not L[key]=value
else:
   # x is not in L so you either append it or append something_else
   L.append(x)

如果您使用: L[x] = somethingif x in L:一起使用只有这些值的列表才有意义:L=[ 0, 1, 2, 3, 4, ...]L=[ 1.0, 2.0, 3.0, ...]

但我会提出这个:

L = []
L.extend(my_iterable)
coder0 = 'farr'
coder1 = 'Mark Byers'
if coder0 not in L:
    L.append(coder1)

奇怪的逻辑