根据第一个元素用字典的最频繁元组制作一个列表
Make a list with the most frequent tuple of a dictionary acording the first element
我正在尝试根据第一个元素创建一个包含字典中出现次数最多的元组的列表。例如:
如果 d 是我的字典:
d = {(Hello, my): 1,(Hello, world):2, (my, name):3, (my,house):1}
我想获取这样的列表:
L= [(Hello, world),(my, name)]
所以我试试这个:
L = [k for k,val in d.iteritems() if val == max(d.values())]
但这只给出了所有元组中的最大值:
L = [('my', 'name')]
我在想,也许我必须翻阅我的字典,为每个元组的每个第一个单词创建一个新字典,然后找到最常见的并将其放入列表中,但我在翻译时遇到了问题在代码中。
在我看来,您不应该只获取所有 d 值的最大值,否则它只会获取字典中包含的最大值,在指定情况下为 3。
我要做的是创建一个中间列表(也许这可以隐藏),将键的第一部分作为第二个元素保存在内存中,并将计数器作为第一个元素。这样你就可以只得到排序列表中的第一个元素,得到真正的最大键。
如果您只是重新键入第一个单词的映射,这在 O(n) 中是可以实现的:
>>> d = {('Hello','my'): 1, ('Hello','world'): 2, ('my','name'): 3, ('my','house'): 1}
>>> d_max = {}
>>> for (first, second), count in d.items():
... if count >= d_max.get(first, (None, 0))[1]:
... d_max[first] = (second, count)
...
>>> d_max
{'Hello': ('world', 2), 'my': ('name', 3)}
>>> output = [(first, second) for (first, (second, count)) in d_max.items()]
>>> output
[('my', 'name'), ('Hello', 'world')]
from itertools import groupby
# your input data
d = {('Hello', 'my'): 1,('Hello', 'world'):2, ('my', 'name'):3, ('my','house'):1}
key_fu = lambda x: x[0][0] # first element of first element,
# i.e. of ((a,b), c), return a
groups = groupby(sorted(d.iteritems(), key=key_fu), key_fu)
l = [max(g, key=lambda x:x[1])[0] for _, g in groups]
您有成对的单词和与每个单词相关联的计数。您可以将信息存储在(或将其转换为)三元组中:
d = [
('Hello', 'my', 1),
('Hello', 'world', 2),
('my', 'name', 3),
('my', 'house', 1)
]
对于第一个位置的每个单词,您想找到第二个位置的单词出现频率最高。根据第一个单词(任何顺序,只是为了将它们分组)对数据进行排序,然后根据计数(降序)对数据进行排序。
d.sort(lambda t1,t2: cmp(t2[2],t1[2]) if (t1[0]==t2[0]) else cmp(t1[0],t2[0]))
最后,遍历生成的数组,跟踪遇到的最后一个单词,并且仅在第一个位置遇到新单词时追加。
L = []
last_word = ""
for word1, word2, count in d:
if word1 != last_word:
L.append((word1,word2))
last_word = word1
print L
通过运行这段代码,你得到[('Hello', 'world'), ('my', 'name')]
。
我正在尝试根据第一个元素创建一个包含字典中出现次数最多的元组的列表。例如: 如果 d 是我的字典:
d = {(Hello, my): 1,(Hello, world):2, (my, name):3, (my,house):1}
我想获取这样的列表:
L= [(Hello, world),(my, name)]
所以我试试这个:
L = [k for k,val in d.iteritems() if val == max(d.values())]
但这只给出了所有元组中的最大值:
L = [('my', 'name')]
我在想,也许我必须翻阅我的字典,为每个元组的每个第一个单词创建一个新字典,然后找到最常见的并将其放入列表中,但我在翻译时遇到了问题在代码中。
在我看来,您不应该只获取所有 d 值的最大值,否则它只会获取字典中包含的最大值,在指定情况下为 3。 我要做的是创建一个中间列表(也许这可以隐藏),将键的第一部分作为第二个元素保存在内存中,并将计数器作为第一个元素。这样你就可以只得到排序列表中的第一个元素,得到真正的最大键。
如果您只是重新键入第一个单词的映射,这在 O(n) 中是可以实现的:
>>> d = {('Hello','my'): 1, ('Hello','world'): 2, ('my','name'): 3, ('my','house'): 1}
>>> d_max = {}
>>> for (first, second), count in d.items():
... if count >= d_max.get(first, (None, 0))[1]:
... d_max[first] = (second, count)
...
>>> d_max
{'Hello': ('world', 2), 'my': ('name', 3)}
>>> output = [(first, second) for (first, (second, count)) in d_max.items()]
>>> output
[('my', 'name'), ('Hello', 'world')]
from itertools import groupby
# your input data
d = {('Hello', 'my'): 1,('Hello', 'world'):2, ('my', 'name'):3, ('my','house'):1}
key_fu = lambda x: x[0][0] # first element of first element,
# i.e. of ((a,b), c), return a
groups = groupby(sorted(d.iteritems(), key=key_fu), key_fu)
l = [max(g, key=lambda x:x[1])[0] for _, g in groups]
您有成对的单词和与每个单词相关联的计数。您可以将信息存储在(或将其转换为)三元组中:
d = [
('Hello', 'my', 1),
('Hello', 'world', 2),
('my', 'name', 3),
('my', 'house', 1)
]
对于第一个位置的每个单词,您想找到第二个位置的单词出现频率最高。根据第一个单词(任何顺序,只是为了将它们分组)对数据进行排序,然后根据计数(降序)对数据进行排序。
d.sort(lambda t1,t2: cmp(t2[2],t1[2]) if (t1[0]==t2[0]) else cmp(t1[0],t2[0]))
最后,遍历生成的数组,跟踪遇到的最后一个单词,并且仅在第一个位置遇到新单词时追加。
L = []
last_word = ""
for word1, word2, count in d:
if word1 != last_word:
L.append((word1,word2))
last_word = word1
print L
通过运行这段代码,你得到[('Hello', 'world'), ('my', 'name')]
。