在列表列表中查找数字

时间:2014-08-29 13:53:19

标签: python list

我有嵌套的数字列表

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函数可以派上用场?

4 个答案:

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