- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个可能很长的命名元组列表(目前它可以达到 10.000 行,但将来可能会更多)。
我需要将每个命名元组的几个元素与列表中的所有其他命名元组进行比较。我正在寻找一种有效且通用的方法来做到这一点。
为了简单起见,我将用蛋糕做一个类比,这样应该更容易理解问题。
有一个命名元组列表,其中每个命名元组都是一个蛋糕:
Cake = namedtuple('Cake',
['cake_id',
'ingredient1', 'ingredient2', 'ingredient3',
'baking_time', 'cake_price']
)
cake_price
和 baking_time
都很重要。如果蛋糕的成分相同,我想从列表中删除不相关的蛋糕。因此,任何同等或更昂贵并且烘烤时间相同或更长时间的蛋糕(具有相同的成分)都是不相关的(下面有一个详细的示例)。
最好的方法是什么?
<小时/>到目前为止,我所做的是按蛋糕价格和烘焙时间对named_tuples列表进行排序:
sorted_cakes = sorted(list_of_cakes, key=lambda c: (c.cake_price, c.baking_time))
然后创建一个新列表,我在其中添加所有蛋糕,只要之前添加的蛋糕没有相同的成分,烘烤起来更便宜、更快。
list_of_good_cakes = []
for cake in sorted_cakes:
if interesting_cake(cake, list_of_good_cakes):
list_of_good_cakes.append(cake)
def interesting_cake(current_cake, list_of_good_cakes):
is_interesting = True
if list_of_good_cakes: #first cake to be directly appended
for included_cake in list_of_good_cakes:
if (current_cake.ingredient1 == included_cake.ingredient1 and
current_cake.ingredient2 == included_cake.ingredient2 and
current_cake.ingredient3 == included_cake.ingredient3 and
current_cake.baking_time >= included_cake.baking_time):
if current_cake.cake_price >= included_cake.cake_price:
is_interesting = False
return is_interesting
(我知道嵌套循环远非最佳,但我想不出任何其他方法来做到这一点......)
<小时/>有
list_of_cakes = [cake_1, cake_2, cake_3, cake_4, cake_5]
哪里
cake_1 = Cake('cake_id'=1,
'ingredient1'='dark chocolate',
'ingredient2'='cookies',
'ingredient3'='strawberries',
'baking_time'=60, 'cake_price'=20)
cake_2 = Cake('cake_id'=2,
'ingredient1'='dark chocolate',
'ingredient2'='cookies',
'ingredient3'='strawberries',
'baking_time'=80, 'cake_price'=20)
cake_3 = Cake('cake_id'=3,
'ingredient1'='white chocolate',
'ingredient2'='bananas',
'ingredient3'='strawberries',
'baking_time'=150, 'cake_price'=100)
cake_4 = Cake('cake_id'=4,
'ingredient1'='dark chocolate',
'ingredient2'='cookies',
'ingredient3'='strawberries',
'baking_time'=40, 'cake_price'=30)
cake_5 = Cake('cake_id'=5,
'ingredient1'='dark chocolate',
'ingredient2'='cookies',
'ingredient3'='strawberries',
'baking_time'=10, 'cake_price'=80)
预期结果是:
list_of_relevant_cakes = [cake_1, cake_3, cake_4, cake_5]
最佳答案
你的方法的运行时间将大致与
len(list_of_cakes) * len(list_of_relevant_cakes)
...如果您有很多蛋糕并且其中很多都是相关的,那么它可能会变得相当大。
我们可以利用这样一个事实来改进这一点:具有相同成分的每簇蛋糕可能会小得多。首先,我们需要一个函数来检查新蛋糕与现有的、已经优化的具有相同成分的集群:
from copy import copy
def update_cluster(cakes, new):
for c in copy(cakes):
if c.baking_time <= new.baking_time and c.cake_price <= new.cake_price:
break
elif c.baking_time >= new.baking_time and c.cake_price >= new.cake_price:
cakes.discard(c)
else:
cakes.add(new)
它的作用是对照 cakes
副本中的每个 cake c
检查 new
蛋糕,然后:
如果它的烘焙时间和价格都大于或等于现有蛋糕,请立即退出(您可以返回
而不是打破
,但我更喜欢明确控制流)。
如果其烘焙时间和价格均小于或等于现有蛋糕,则从集群中删除该现有蛋糕
如果它越过所有现有的蛋糕(因此到达 for
语句的 else
子句),请将其添加到集群中。
一旦我们有了它,我们就可以用它来过滤蛋糕:
def select_from(cakes):
clusters = {}
for cake in cakes:
key = cake.ingredient1, cake.ingredient2, cake.ingredient3
if key in clusters:
update_cluster(clusters[key], cake)
else:
clusters[key] = {cake}
return [c for v in clusters.values() for c in v]
这是在行动:
>>> select_from(list_of_cakes)
[Cake(cake_id=1, ingredient1='dark chocolate', ingredient2='cookies', ingredient3='strawberries', baking_time=60, cake_price=20),
Cake(cake_id=4, ingredient1='dark chocolate', ingredient2='cookies', ingredient3='strawberries', baking_time=40, cake_price=30),
Cake(cake_id=5, ingredient1='dark chocolate', ingredient2='cookies', ingredient3='strawberries', baking_time=10, cake_price=80),
Cake(cake_id=3, ingredient1='white chocolate', ingredient2='bananas', ingredient3='strawberries', baking_time=150, cake_price=100)]
该解决方案的运行时间大致与以下成正比:
len(list_of_cakes) * len(typical_cluster_size)
我对随机蛋糕列表做了一些测试,每个蛋糕都使用从五种不同成分中选择的内容以及随机价格和烘焙时间,并且
此方法始终会产生与您的结果相同的结果(尽管未排序)
它的运行速度要快得多 - 在我的机器上运行 100,000 个随机蛋糕只需 0.2 秒,而您的机器上运行大约 3 秒。
关于python - 比较命名元组列表中的多个(但不是全部)元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42139168/
如标题所示,ans_list是一个答案列表,ans_index是一个数字(答案在词汇表中的索引,但与atm无关) 这里生成的 tree.anslist 是什么? (例如,仅针对第一个),忽略迭代。 f
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将具有一个元素的东西拿走。 这与 How do I “flatte
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将带有一个元素的东西拿走。 这与 How do I “flatte
这个问题已经有答案了: Convert nested list to 2d array (3 个回答) 已关闭 7 年前。 java中有没有快捷方式可以转换 List> 到 String[][] ?
我在排序时遇到问题 List> 。我创建了一个自定义比较器,在其中编写了对数据进行排序的代码。 public class CustomComparator implements Comparator
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Java Generics: Cannot cast List to List? 我只是想知道为什么下面的java代
试图想出一个 LINQy 方法来做到这一点,但我什么也没想到。 我有一个对象列表<>,其中包含一个属性,该属性是逗号分隔的字母代码列表: lst[0].codes = "AA,BB,DD" lst[1
假设我有这些任务: points = [] point = (1, 2) 我怎么会这样做: points += point 它工作得很好,并且给了我点 = [1, 2]。但是,如果我这样做: poin
如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]。 我有一个方法返回 Task[List[Header]] 并多次调用 do
如何在 Java 中查找二维列表的元素? 我有一个参数为 List> 的函数我想知道如何找到这个列表的行和列。 最佳答案 如果你喜欢 List> obj 然后你就可以像这样访问 obj.get(cur
分配 List到 List工作正常。 分配 List>到 List>不编译。 代码 public class Main { public static void main(String[] a
我正在用 Java 编写一个方法,该方法必须接收并迭代 Serializable 的 List。 有什么区别: public void myMethod(List list) { } 和 public
我看到很多人想用 mvvm 更新网格/列表/树的一部分,但他们不想刷新整个列表。 对于所有遇到此问题的人,我做了以下示例。 希望这对你有用。 最佳答案 这是一个简单的例子。整个代码中最重要的是: Bi
我正在为现有的 C++ 库编写包装器,该库使用列表,其中 T 是自定义结构。我被建议使用 vector 而不是列表,但我试图避免修改库。 为了更好地理解这个场景,我做了一个简单的应用程序,使用一个列表
List list List list 这两种声明有什么区别吗? 谢谢, 最佳答案 是的。 List可以包含所有派生自 Base 的不同事物的混合物. List包含同质项(从某种意义上说,它们必须全部
有人可以尽可能详细地解释以下类型之间的区别吗? List List List 让我更具体一点。我什么时候想使用 // 1 public void CanYouGiveMeAnAnswer(List l
我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
也许是一个时髦的标题,但我遇到了以下问题: 给定一个类型为 (a * b) list 的列表,我想创建一个类型为 (a * b list) list 的新列表。一个例子: 给定列表 let testL
我是一名优秀的程序员,十分优秀!