在少数列表中找到唯一值的有效方法

时间:2015-12-02 21:02:37

标签: python list python-3.x

我现在有这样的代码有2个列表:

movies = [{'name': '007: Spectre', 'year': 2015, 'length': '2:05'}, 
          {'name': 'Terminator Genesis', 'year': 2015, 'length': '2:20'}]
rest_movies = [{'name':'Bridge of Spies', 'year': 2015, 'length': '1:50'},
               {'name': 'Star Wars', 'year': 2015, 'length': '2:30'}]

check_if_movie_in_one_of_lists = 'Star Wars'

for line in movies:
    name = line['name']
    if name == check_if_movie_in_one_of_lists:
        movie_year = line['year']
            print(movie_year)
        break
else:
    for line in rest_movies:
        name = line['name']
        if name == check_if_movie_in_one_of_lists:
            movie_year = line['year']
            print(movie_year)
            break

我认为这不是pythonic方式来检查其中一个列表中是否需要值。

就我而言:

  1. 列表可以是随机大小。
  2. 列表的数量也可以是随机的(现在只有2,但会更多)。
  3. 列表中没有重复的值。
  4. 寻找Python 3的解决方案

2 个答案:

答案 0 :(得分:1)

修改

因此,如果您必须保留当前结构中的内容,最好的方法就是:

movie_lists = [movies, rest_movies, ...]
for movie_list in movie_lists:
    for item in movie_list:
        if item['name'] == movie_to_find:
            print(item['year'])
            break

但这只有在您使用此信息一次时才有意义。如果你需要多次这样做(O(n)* m),循环一次构造name: year形式的dicts是有意义的,然后利用dict查找的速度(O(n)+ O(1)<&lt; O(n)* m)。

我会将你的两个列表更改为两个dicts,因为dict查找是O(1)(其中列表查找是O(n)):

movies = {'007: Spectre': 2015}, {'Terminator Genesis': 2015}
rest_movies = {'Bridge of Spies': 2015}, {'Star Wars': 2015}

movie_to_find = 'Star Wars'

if movie_to_find in movies:
    print(movies[movie_to_find])
elif movie_to_find in rest_movies:
    print(rest_movies[movie_to_find])

对于具有多个dicts的通用解决方案,将dicts存储在列表中并遍历列表:

movie_sets = [movies, rest_movies, other_movies, ...]

for movie_set in movie_sets:
    if movie_to_find in movie_set:
        print(movie_set[movie_to_find])

要将您的dicts列表转换为独立的dicts:

movies = dict((m['name'], m['year']) for m in movies)
rest_movies = dict((m['name'], m['year']) for m in rest_movies)

答案 1 :(得分:0)

要在列表中查找值,请使用list.index(value)。这将为您提供列表中指定值的索引。

来自docs

  

返回值为x的第一个项目列表中的索引。如果没有这样的项目,则会出错。

示例:

>>> lst = [1,2,3]
>>> lst.index(1)
0
>>> lst.index(3)
2