将列表按点分成较小的列表

问题描述 投票:-1回答:2

我编写了一个函数,例如[[“ a”,1],[“ b”,2],[“ a”,2],[“ b”,3]],其中每个小列表有一个字母和一个数字,并返回[[“ a”,1,2,“ b”,2,3]]。

这个问题还有很多,但为了简单起见,下一步就是将其转换为形式[[“ a”,3],[“ b”,5]]。每个较小列表的第二项是字母之间的数字总和,即1,2与“ a”相关,2,3与“ b”相关,如原始列表所示。字母出现的次数是无限的。

另一个示例总结:function([[“ a”,1,3,4,“ b”,2,2,“ c”,4,5]])=> [[“ a”,8], [“ b”,4],[“ c”,9]]

我写的任何东西都无法接近完成这一目标。这是一种基本的挑战,没有列表理解,也无法导入任何内容

python python-3.x for-loop nested-lists
2个回答
0
投票

通常期望您首先发布解决方案,但是似乎您已经尝试了一些事情并且需要帮助。对于以后的问题,请确保您尝试[[include,因为它可以帮助我们提供有关[[why解决方案不起作用的更多帮助,以及可以采取哪些其他步骤来改进您的解决方案。

假设您的列表始终以字母或str开头,并且所有数字均为int类型,则可以使用词典进行计数。我添加了注释来解释逻辑。 def group_consecutive(lst): groups = {} key = None for item in lst: # If we found a string, set the key and continue to next iteration immediately if isinstance(item, str): key = item continue # Add item to counts # Using dict.get() to initialize to 0 if ket doesn't exist groups[key] = groups.get(key, 0) + item # Replacing list comprehension: [[k, v] for k, v in groups.items()] result = [] for k, v in groups.items(): result.append([k, v]) return result

然后您可以像这样调用该函数:

>>> group_consecutive(["a",1,3,4,"b",2,2,"c",4,5])
[['a', 8], ['b', 4], ['c', 9]]

[一种更好的解决方案可能会使用collections.Countercollections.Counter进行计数,但是由于您没有提到导入,因此上述解决方案将坚持这一点。


0
投票
collections.defaultdict

此代码只能通过脚本运行一次,但可以转换为嵌套函数以按您所期望的方式使用它。

© www.soinside.com 2019 - 2024. All rights reserved.