我有嵌套的数字列表
my_list = [[0,1,2,3,4,5],[6,7,8,9,10,11],[12,56,86,9],[55,53,12]]
我想知道给定号码属于哪个子列表
例如,如果我正在搜索数字1
算法应返回0,因为1属于第一个子列表。
如果我要找9,我应该得到1和2.
我已经看到这里已经有了解决方案 Python search in lists of lists
但问题是我使用大量列表和循环并不是最佳解决方案。
是否有任何内置的python函数可以派上用场?
答案 0 :(得分:2)
您可以使用列表推导,如下例所示。对于每个列表,它检查数值是否在列表中。请注意,这仍然使用迭代(以列表推导的形式),但除非您使用类似numpy
(不内置)的内容,否则您将不得不迭代
my_list = [[0,1,2,3,4,5],[6,7,8,9,10,11],[12,56,86,9],[55,53,12]]
def find(my_list, number):
return [i for i, x in enumerate(my_list) if number in x]
print(find(my_list, 9))
# [1, 2]
答案 1 :(得分:0)
你可以使用列表理解,但不确定它是否比循环更好地优化:
def search(my_list, n)
result = [i for i in range(len(my_list)) if n in my_list[i]]
return result
答案 2 :(得分:0)
优化是一个有趣的主题,根据问题可以有许多不同的方法。
在这种情况下,如果订购了数据,那么您可以开始使用假设来最小化使用昂贵的in
关键字所需的次数。
即,按时间顺序制作每个子列表,并根据第一个元素对这些列表进行排序。
所以首先制作一个像这样运作的排序功能(我会留给你)
>>> my_list = [[0,1,2,3,4,5],[6,7,8,9,10,11],[12,56,86,9],[55,53,12]]
>>> my_sort_func(my_list)
>>> print my_list
[[0,1,2,3,4,5],[6,7,8,9,10,11],[9,12,56,86],[12,53,55]]
现在您可以设计更简化的搜索功能
/*
* @pre my_list is sorted
*/
def search(my_list, key):
result = []
for index, l in enumerate(my_list):
if(l[0] > key):
break
if(l[-1] < key):
continue
if (key in l):
result.append(index)
return result
答案 3 :(得分:0)
列表不是查找元素的最佳数据结构,您应该考虑使用集合,这为您提供了O(1)查找时间。如果您的列表没有交叉点,那么有更好的数据结构和算法,但由于您希望所有列表,所以替代品会更少。
lsts = [[0,1,2,3,4,5], [6,7,8,9,10,11], [12,56,86,9], [55,53,12]]
sets = map(set, lsts)
def find(iterables, element):
return [i for i, iterable in enumerate(iterables) if element in iterable]