1

有没有办法在函数中使用列表理解“语法”来减少计算/调用(有点像 try/catch),例如一种写作方式

customers=dict

for customer in customers:
  if movie not in customers[customer]:
          customers[customer].append(movie)

作为

for customer in customers:
  p.append(movie) if movie not in p=customers[customer]

如果调用/操作p非常繁重,那么它很重要,如果它被调用一次或两次

4

3 回答 3

3

您可以items在列表理解中使用 dict 的方法:

[ expression for key,val in customers.items() ]

所以你可以滥用它来产生附加的副作用:

[ val.append(movie) for key,val in customers.items() if movie not in val ]

list-comprehension 的实际值几乎没有用:它将是一个列表None(但它的长度会告诉你有多少val不包含movie)。

有时,更短的风格并不是更好的风格。我想这可能是其中之一。

编辑:刚刚意识到key是未使用的,所以该.values()方法更好(我发现它的用途很少我忘记它!)

[ val.append(movie) for val in customers.values() if movie not in val ]
于 2019-10-16T12:22:50.780 回答
0

不确定您要减少哪种“计算/调用”,但如果它是 的双重查找customers[customer],您可以这样做:

for movies in customers.values():
    if movie not in movies:
        movies.append(movie)

.values() 迭代 dict 的值(因此在您的情况下,每个客户的电影列表),因此它避免了对客户进行迭代并两次查找电影列表。假设customers是 a dictof lists 作为值。您甚至可以使用 a dictof sets 来增强它:

for movies in customers.values():
   movies.add(movie)
于 2019-10-16T12:17:48.337 回答
0

一行代码:

[movies.append(movie) for movies in customers.values() if movie not in movies]

dict.values()返回字典值的类似列表的对象,不包括键。list.append上面的行计算, 但list.append返回的返回值列表None,并且无论如何都会丢弃该列表。


我建议实际写出完整的逻辑:

for movies in customers.values():
    if movie not in movies:
        movies.append(movie)

并且仅在您实际需要列表时使用列表理解。它只会让那些不理解列表理解的人感到困惑,并且它不提供任何加速或更清晰的代码。

此外,如果您不想在 a 中重复项目list,请考虑 a set,它包含不同的元素并提供加速。

于 2019-10-16T14:15:56.933 回答