假设我有一个名为的列表
a =['apple' 'anachi', 'butter' 'bread', 'cat' , 'catre']
我需要按如下方式返回元素:
a['a']
应该返回[apple, anachi]
a['b']
应该返回['butter', 'bread']
我如何在python中执行此操作
答案 0 :(得分:4)
如果您只想通过第一个字符访问您的姓名列表a
,请注意,它不再是一个列表,我会为您提供以下解决方案:
>>> from collections import defaultdict
>>> a =['apple', 'anachi', 'butter', 'bread', 'cat' , 'catre']
>>> d=defaultdict(list)
>>> for s in a:
d[s[0]].append(s)
>>> a=d
>>> a['a']
['apple', 'anachi']
>>> a['b']
['butter', 'bread']
答案 1 :(得分:1)
你有很多选择。
首先,请注意目前列表的行为:
a =['apple' 'anachi', 'butter' 'bread', 'cat' , 'catre']
print a[0] # appleanachi
print a[1] # butterbread
由于你在“苹果”和“anachi”,“黄油”和“面包”之间缺少逗号,因此它们会被连接起来。我不确定那是你想要的。
如果您更正为了使其成为“平面”列表,您可以使用切片语法从列表中提取元素,但是您需要知道索引才能执行此操作:
a = ['apple', 'anachi', 'butter', 'bread', 'cat' , 'catre']
print a[0:2] # ['apple', 'anachi']
print a[2:4] # ['butter', 'bread']
或者,您可以使用嵌套列表,然后您不需要切片语法,只需要“对”的单个索引:
a = [['apple', 'anachi'], ['butter', 'bread'], ['cat' , 'catre']]
print a[0] # ['apple', 'anachi']
print a[1] # ['butter', 'bread']
到目前为止,所有这些方法都要求您知道索引,但如果您不,并且您想要从列表中提取具有特定前缀/以某个字母开头的元素组合,你可以做类似的事情:
def search(lst, pre):
return [e for e in lst if e.startswith(pre)]
a = ['apple', 'anachi', 'butter', 'bread', 'cat' , 'catre']
print search(a, 'a') # ['apple', 'anachi']
print search(a, 'b') # ['butter', 'bread']
这种搜索方法也可以用于嵌套列表,例如,如果你想找到所有“对”,其中对的第一项以给定的前缀开头:
def search(lst, pre):
return [p for p in lst if p[0].startswith(pre)]
a = [['apple', 'anachi'], ['butter', 'bread'], ['cat' , 'catre']]
print search(a, 'a') # [['apple', 'anachi']]
print search(a, 'b') # [['butter', 'bread']]
答案 2 :(得分:0)
我要做的是实现自定义序列:
from collections import Sequence
class MyList(Sequence):
def __init__(self, data=()):
super(MyList, self).__init__()
self._list = list(data)
def __getitem__(self, key):
if type(key) == int:
return self._list[key]
return [e for e in self._list if e.startswith(key)]
def __len__(self):
return len(self._list)
a = MyList(['apple', 'anachi', 'butter', 'bread', 'cat' , 'catre'])
print a['a'] # prints ['apple', 'anachi']
print a['b'] # prints ['butter', 'bread']
print a['ca'] # prints ['cat' , 'catre']
此处关键部分是自定义__getitem__
,我们不是简单地从基础列表self._list
返回项目,而是从self._list
返回一个新的项目列表,给予关键。
请注意,上面的代码没有错误处理(例如,您需要检查元素是否只是字符串才能使用)。
答案 3 :(得分:0)
使用itertools.groupby
:
>>> my_dict = {}
>>> for x,y in itertools.groupby(a, key=lambda x:x[0]):
... my_dict[x] = my_dict.get(x,[]) + list(y)
...
>>> my_dict['a']
['apple', 'anachi']
>>> my_dict['b']
['butter', 'bread']
>>> my_dict['c']
['cat', 'catre']