- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Python 3.5.2,并且我有一个 dict
包含作为“键”的字符串元组,以及作为“值”的计数中的整数。我想做双重排序,其中第一优先级是键中的第一个字符串,第二优先级是整数值。请参阅下面的更深入的解释:
例如,我有一个字典:
>>> print(unorderedDict.items())
dict_items([(('has', 'accomplished'), 1), (('new', 'french'), 1), (('pieces', 'machinery'), 1), (('in', 'those'), 1), (('east', 'on'), 1), (('sectarian', 'principles'), 1), ((',', 'are'), 10), (('all', 'countries'), 2)......])
它包含两个字符串的元组作为键。 ('has', 'accomplished')
还有一个整数 ex 的值。 1
。前任。全部在一起:([(('all', 'countries'), 2)])
.
这本质上包含在文本中找到的所有唯一的单词组合,以元组形式作为键,以及单词的唯一组合在文本中出现的次数作为整数值。
我想要一种对 unorderedDict
进行排序的方法,第一个是键元组中的第一个字符串,第二个是值。
这样做的目的是让我有一个单词列表,加上最有可能跟随它的单词,以及列表中的下一个相同单词以及文本中下一个最可能跟随它的单词。
示例输出:
dict_items([(('all', 'the'), 10), (('all', 'of'), 7), (('big', 'drums), 12), (('big', 'dogs') 6)......])
请注意它如何首先按元组中的第一个字符串(按字母顺序)排序,然后按值(数字从高到低)排序。
为了执行这种类型的排序算法,我需要什么 Python 3 代码?
需要这种排序算法的主要原因是,我可以随机选择元组中的第一个字符串,并获取元组中更常见的第二个字符串(由 Count 中的整数标识)。
例如,我可以随机选择“all”,并发现它后面更有可能是“the”而不是“of”(“the”的 vount = 10,“of”的 vount = 7 )。
根据我自己的研究,我认为这与内置 dict
有关。排序方法和 lambda
也许是这样,但这对我来说是新领域,所以我真的不知道。
最佳答案
基本上这可以通过 OrderedDict
来完成:
from collections import OrderedDict
OrderedDict(sorted(unorderedDict.items(), key=lambda x: (x[0][0], x[1])))
# first string of key----^^^^^^^ ^^^^---value
但是我认为你应该考虑使用另一种数据结构。例如,list
的无序 dict
似乎是一个不错的选择,因为您只对第一个单词后面最常见的单词感兴趣:
import bisect
unorderedDict = dict([(('has', 'accomplished'), 1), (('has', 'done'), 5),
(('new', 'french'), 1), (('has', 'failed'), 3),
(('pieces', 'machinery'), 1), (('in', 'those'), 1),
(('east', 'on'), 1), (('sectarian', 'principles'), 1),
((',', 'are'), 10), (('all', 'countries'), 2)])
result = {}
for (key1, key2), counts in unorderedDict.items():
if key1 not in result:
# add a new key
result[key1] = [(counts, key2)]
else:
# We want the lists to be sorted so we can use bisection to do this quite efficient
bisect.insort_left(result[key1], (counts, key2))
>>> print(result)
{'sectarian': [(1, 'principles')],
'pieces': [(1, 'machinery')],
',': [(10, 'are')],
'all': [(2, 'countries')],
'has': [(1, 'accomplished'), (3, 'failed'), (5, 'done')], # sorted from low to high!
'new': [(1, 'french')],
'in': [(1, 'those')],
'east': [(1, 'on')]}
外部字典未排序,因为我怀疑它不需要(如果应该排序,那么我不知道如何排序)。
<小时/>替代方案可以是 collections.Counter
作为内部结构,因为它有一个很好的 .most_common
方法:
from collections import Counter
result = {}
for (key1, key2), counts in unorderedDict.items():
if key1 not in result:
result[key1] = Counter()
result[key1][key2] = counts
>>> result['has'].most_common() # returns it sorted!!!
[('done', 5), ('failed', 3), ('accomplished', 1)]
>>> result['has'].most_common(1)
[('done', 5)]
>>> result['has']['failed'] # can be accessed like a dictionary too
3
关于python - 对由字符串元组作为键和整数作为值组成的字典进行双重排序,首先按元组中的第一个字符串,然后按值整数Python 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41930086/
typing模块中使用List、Tuple等有什么区别: from typing import Tuple def f(points: Tuple): return map(do_stuff,
如何遍历列表的每 5 个元素并将它们组成一个元组,然后将同一列表的第 6 个元素作为第二个元组 - 然后对接下来的 5 个元素和第 6 个元素执行相同的操作。 我读过 operator.itemget
我有一个 Seq[((元组 A),(元组 B))] 有没有一种简单的方法来对元组 A 进行分组,以便我得到 Seq[(Tuple A, Seq[Tuple B])] 我试过 groupby(x =>
如果我有以下内容 val A = List(1,2,3) val B = List(1,2,3) 这两个变量是否有相同的内存地址? 最佳答案 它们不会有相同的内存地址,可以使用 eq 方法确认,com
我实际上是在尝试创建一个配对列表,但事实证明这非常困难 在有人提到 Hashtables 之前请注意,会有我不关心的重复项。 例如,如果我这样做 $b = @{"dog" = "cat"} 我明白了
我正在尝试为其他资源中的 for_each 循环创建局部变量,但无法按预期制作局部映射。 以下是我试过的。 (地形 0.12) 预期映射到循环 temple_list = { "test2-role"
我目前正在学习 Haskell,在 FP 方面我绝对是初学者。 现在我正在尝试使用列表推导式进行不同的操作。 listComprehension = [(a,b,c) | a <- xs, b <
我正在尝试为其他资源中的 for_each 循环创建局部变量,但无法按预期制作局部映射。 以下是我试过的。 (地形 0.12) 预期映射到循环 temple_list = { "test2-role"
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
如何通过元组中的第三项过滤此类型的列表: type Car = (String, [String], Int [String]) 我看到了 snd和 fst方法,但在这里我认为这行不通,我不确定如何在
有没有办法创建 Tuple 在 Java 中,无需创建多个类? 例如,可以为每种不同类型的元组创建不同的类,每个类具有不同数量的 Type Parameters : public class Sing
我必须处理一堆二维点类型:pair , pair , pair ,并且只要存在坐标转换,我就允许点之间的隐式转换。像这样: template inline operator pair ( pair t
这个问题在这里已经有了答案: How do I iterate through two lists in parallel? (8 个答案) How do I iterate over the tu
编写一个函数 square_odd_terms 接受一个元组作为参数并返回一个元组中奇数项的平方的元组。即使是条款也将保持不变。 我的尝试是: def square_odd_termms(tpl):
更新: 我选择了这个: set(item[1] for item in id) 谢谢你们,你们的想法对我有帮助。 我正在处理一个元组列表: 以下面这行代码为例。我的 list 可以是任何长度。但是,我
我一直在尝试执行此任务,在尝试时我不禁想到会有比我一直尝试的方式更好的编码方式。 我有一行文字和一个关键字。我想在每个列表中的每个字符下创建一个新列表。关键字将重复自身直到列表末尾。如果有任何非字母字
我现在这个问题已经被问过好几次了。但是,答案似乎并没有解决我的问题。我收到类型错误,“元组”对象不可调用。即使列表中的元组以正确的方式用逗号分隔,我也得到了这个: def aiMove(b):
嘿,所以我花了两个多小时试图解决这个问题,但我就是做不对。我猜我犯了一个非常简单的错误,所以如果有人能指出我正确的方向,我将非常感激,谢谢!顺便说一句,这是一门树屋类(class)。 “目前我们的问候
这不是一个严格的编程问题,但为什么是tuple在单独的 header 中定义,而不是添加到 连同 pair ?它看起来更自然,不那么困惑等。 最佳答案 在具有细粒度的 header 和只有一个 hea
我是一名优秀的程序员,十分优秀!