Python AttributeError:'list'对象没有属性'startswith'

时间:2017-04-11 22:21:41

标签: python

我试图获取某些数据中某些元素的索引。我想找到'b'和'c'的所有实例,并将它们的索引放在'position_b'和'position_c'中。这是我写的代码,我收到错误:

data = [['a', 'b', 'c'], ['a', 'a', 'a'], ['b', 'c', 'c'], ['d', 'b', 'f'], ['g', 'c', 'i']]

position_b, position_c = [], []   
for line in data:
  if data.startswith("b"):
    position_b.append(line.index("b"))
  elif data.startswith("c"):
    position_c.append(line.index("c"))

如上面的数据所示,有些行不会有b或c,有些行会同时有两行。

我最初只尝试'索引',但这给了我'未找到子字符串'错误,因为有些列表没有'b'或'c'。然后我从答案here尝试'startswith',但这给了我错误'AttributeError:'list'对象没有属性'startswith''我现在明白,startswith不能用于列表对象。我可以用什么来查找和列出我列表中的'b'或'c'?

期望的输出:

position_b = [1, 0, 1]
position_c = [2, 1, 2, 1]

2 个答案:

答案 0 :(得分:0)

虽然您希望使用startswith,但您似乎只想知道列表是否包含某个项目,无论其位置如何。因此,您只需使用in关键字。

if "b" in data:
    position_b.append(line.index("b"))

或者:

try:
    index = line.index("b")
except ValueError:
    # line doesn't contain "b"
    pass
else:
    position_b.append(index)

希望这有帮助!

答案 1 :(得分:0)

您可以使用list comprehension以这种方式完成任务:

我认为data变量是这样的列表列表:

data = [['a', 'b', 'c'], ['a', 'a', 'a'], ['b', 'c', 'c'], ['d', 'b', 'f'], ['g', 'c', 'i']]

所以,你可以这样做:

position_b = [(k,i) for k,v in enumerate(data) for i,j in enumerate(v) if j == 'b']
position_c = [(k,i) for k,v in enumerate(data) for i,j in enumerate(v) if j == 'c']

print("position_b:", position_b)
print("position_c:", position_c)

输出:

# position:   0, 1
#             v  v
position_b: [(0, 1), (2, 0), (3, 1)]
position_c: [(0, 2), (2, 1), (2, 2), (4, 1)]

修改

只能使用list comprehensionfor loops这样的方式编写整个enumerate语法:

position_b, position_c = [], []
for k,v in enumerate(data):
    for i,j in enumerate(v):
        if j == 'b':
            position_b.append((k,i))
        if j == 'c':
            position_c.append((k,i))

print(position_b)
print(position_c)

输出:

[(0, 1), (2, 0), (3, 1)]
[(0, 2), (2, 1), (2, 2), (4, 1)]