标签: dictionary-comprehension

使用有序字典作为有序集

既然Python 3.7使得保留顺序的dicts 正式成为语言规范的一部分而不是实现细节,那么我一直在努力探讨如何最好地使用这个属性.今天,我发现我需要一个订单保留集,并认为字典可以做到这一点.

假设我们有一个hashable元素列表.我们需要一个唯一条目列表,我们希望根据首次出现保留这些条目的顺序.一个简单的字典构造函数应该做的伎俩:

ls = "Beautiful is better than ugly. Explicit..."
uniques = list({s:0 for s in ls})

>>> ['B', 'e', 'a', 'u', 't', 'i', 'f', 'l', ' ', 's', 'b', 'r', 'h', 'n', 'g', 'y', '.', 'E', 'x', 'p', 'c']
Run Code Online (Sandbox Code Playgroud)

这将通过首次出现保留排序并消除所有重复.

我想知道社区对这个用例以及一般的订单保留功能的看法.

  • 有没有理由不使用这种方法?
  • 有没有更好的方法来解决这个问题?
  • 这种方法是Pythonic吗?

通过Python的Zen阅读,我很矛盾.该方法很简单,但依赖于隐式排序.

请让我知道你在想什么.谢谢.

python python-3.x dictionary-comprehension python-3.7

8
推荐指数
2
解决办法
1770
查看次数

削减Python中的列表字典

我正在使用Python中的字谜程序字典.键是排序字母的元组,值是具有这些字母的可能单词的数组:

wordlist = {
   ('d', 'g', 'o'): ['dog', 'god'],
   ('a', 'c', 't'): ['act', 'cat'],
   ('a', 's', 't'): ['sat', 'tas'],
}
Run Code Online (Sandbox Code Playgroud)

我正在使用正则表达式来过滤列表.因此,r't$'作为过滤器,最终结果应为:

filtered_list = {
   ('a', 'c', 't'): ['act', 'cat'],
   ('a', 's', 't'): ['sat'],
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经把它归结为两步了.首先,保留与表达式匹配的所有单词:

tmp = {k: [w for w in v if re.search(r't$', w)] for k, v in wordlist.items()}
Run Code Online (Sandbox Code Playgroud)

这给我留下了空列表:

{
   ('d', 'g', 'o'): [],
   ('a', 'c', 't'): ['act', 'cat'],
   ('a', 's', 't'): ['sat'],
}
Run Code Online (Sandbox Code Playgroud)

然后我需要第二遍来摆脱空列表:

filtered_list = {k: v for k, v in tmp.items() if …
Run Code Online (Sandbox Code Playgroud)

python dictionary list-comprehension dictionary-comprehension

7
推荐指数
1
解决办法
108
查看次数

在Python中查找字符串中的字符数

我正在尝试创建一个单词字典和它在字符串中重复的次数.假设字符串如下所示

str1 = "aabbaba"
Run Code Online (Sandbox Code Playgroud)

我想创建一个这样的字典

word_count = {'a':4,'b':3}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用字典理解来做到这一点.我做到了

dic = {x:dic[x]+1 if x in dic.keys() else x:1 for x in str}
Run Code Online (Sandbox Code Playgroud)

这最终会给出一个错误说法

  File "<stdin>", line 1
    dic = {x:dic[x]+1 if x in dic.keys() else x:1 for x in str}
                                               ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

谁能告诉我语法有什么问题?另外,如何使用字典理解创建这样的字典?

python string counter dictionary dictionary-comprehension

7
推荐指数
2
解决办法
3322
查看次数

Python:使用字典理解附加到值列表

我有以下场景 - 考虑如下的字典列表(输入):

data = [{'key1' : 'k1v1', 'key2': 'k2v1'}, {'key1': 'k1v2', 'key2': 'k2v2'}, 
{'key1': 'k1v3', 'key2': 'k2v3'}, {'key1': 'k1v4', 'key2': 'k2v4'}]
Run Code Online (Sandbox Code Playgroud)

可以看出,字典中的键是相同的。所以我想要做的是以下(期望的输出):

{'key1': ['k1v1', 'k1v2', 'k1v3', 'k1v4'], 'key2': ['k2v1', 'k2v2', 'k2v3', 'k2v4']}
Run Code Online (Sandbox Code Playgroud)

为了实现这一点,我可以使用以下简单的直接嵌套循环:

data_dict = dict()
for d in data:
    for k, v in d.items():
        if k in data_dict:
            data_dict[k].append(v)
        else:
            data_dict[k] = [v]
Run Code Online (Sandbox Code Playgroud)

问题:我们可以使用字典理解来做到这一点吗?换句话说,我们可以在字典理解中附加到现有的值列表吗?

dictionary python-3.x dictionary-comprehension

7
推荐指数
1
解决办法
567
查看次数

Python3:通过理解从字典中有条件地提取键

我需要提取其值超过某个条件的字典的那些键.基本上,我想这样做,只是以更短,更pythony的方式:

keys=[]
for key in dict:
    if dict[key]==True:
        keys.append(key)
Run Code Online (Sandbox Code Playgroud)

这是我最初的想法,但它引发了一个ValueError:

[key for (key,val) in map if val==True]
Run Code Online (Sandbox Code Playgroud)

我暂时想出了这个,但我不禁觉得它不是很好:

[key for key in map.keys() if map[key]==True]
Run Code Online (Sandbox Code Playgroud)

是否有一个不那么混乱的方式呢?也许显而易见的是我明显失踪了?

谢谢!

python dictionary python-3.x dictionary-comprehension

6
推荐指数
2
解决办法
4398
查看次数

可以使用python字典理解来创建子字符串及其位置的字典吗?

给定一串字符,我想创建一个包含在字符串中的所有n字符子串的字典,其中字典键是子字符串,值是列表.列表的第一个元素是子字符串的出现次数,列表的第二个元素是这些出现的起始位置列表.

例如,使用n=3,字符串'abcdabcxdabc'会生成此字典:

{'abc': [3, [0, 4, 9]], 
 'cda': [1, [2]], 
 'dab': [2, [3, 8]], 
 'bcd': [1, [1]], 
 'cxd': [1, [6]], 
 'bcx': [1, [5]], 
 'xda': [1, [7]]}
Run Code Online (Sandbox Code Playgroud)

下面的代码工作并且是有效的,因为它只遍历字符串一次,但我想知道是否有更优雅和/或更pythonic方式来执行此操作,可能使用字典理解.我对python很新,并且仍在试图弄清楚何时使用理解等有意义(甚至可能).

text = 'abcdabcxdabc'
n = 3
d = {}
for i in range(len(text) - n + 1):
    sub = text[i:i + n]
    if sub in d:
        d[sub][0] += 1
        d[sub][1].append(i)
    else:
        d[sub] = [1, [i]]
print(d)    
Run Code Online (Sandbox Code Playgroud)

更新:感谢所有回复.他们通常证实我怀疑这太复杂了,无法在一次理解中有效地实施(但感谢火山表明如果效率不是一个问题就有可能实现).感谢RemcoGerlich和Ignacio Vazquez-Abrams将我指向defaultdict.我将不得不深入研究这一点.我的计时结果表明,与dict相比,初始化defaultdict会有更多的开销,但是运行时间可能稍微快一点,至少对于这个例子.(时间结果发布在下面单独的评论中.)现在我想知道是否有任何情况下dict优先于defaultdict.还有,感谢Narcolei指点我的timeit功能.

python dictionary dictionary-comprehension

6
推荐指数
1
解决办法
273
查看次数

Kotlin中Python列表,集合和地图理解的等价物是什么?

在Python中,有列表推导和类似的地图和集合结构.在Kotlin中,任何具有类似名称的文档都没有任何内容.

这些理解的等价物是什么?例如,Python 3 Patterns,Recipes and Idioms中的那些.其中包括对以下方面的理解:

  • 名单
  • 字典

注意: 这个问题是由作者故意编写和回答的(答案问题),因此对于常见问题的Kotlin主题的惯用答案存在于SO中.

list-comprehension kotlin dictionary-comprehension

6
推荐指数
1
解决办法
1807
查看次数

重写为字典理解

我想使用词典计算单词中所有字母的出现。到目前为止,我已经尝试过为dict添加for循环。

我想知道是否可以使用字典理解?

word = "aabcd"
occurrence = {}
for l in word.lower():
    if l in occurrence:
        occurrence[l] += 1
    else:
        occurrence[l] = 1
Run Code Online (Sandbox Code Playgroud)

python dictionary-comprehension

6
推荐指数
1
解决办法
179
查看次数

为什么在字典理解中禁止字典解包?

我一直在尝试字典理解,正当我以为我掌握了它的窍门时,我收到了错误:SyntaxError: dict unpacking cannot be used in dict comprehension

这是我尝试过的示例:

a = {'a': 1, 'b': 2}                                                                                                                                                                 
b = {'b': 3, 'c': 4}                                                                                                                                                                 

{**a, **b}              # {'a': 1, 'b': 3, 'c': 4}
{ **c for c in [a, b] } # SyntaxError: dict unpacking cannot be used in dict comprehension
Run Code Online (Sandbox Code Playgroud)

我看过类似的帖子,它们提供了解决这个特定问题的方法(主要是字典理解中的字典合并),但我从未见过关于为什么会发生这种情况的解释。

我发现了这个问题40715,但我也找不到答案。

如果有人可以阐明这个主题,或者将我重定向到一篇文章或诸如此类的内容,我将不胜感激。

dictionary python-3.x dictionary-comprehension

6
推荐指数
1
解决办法
771
查看次数

Python:在键相同的字典列表中组合唯一值?

我不确定我是否以正确的方式提问,但这是我的问题:

我有以下格式的字典列表:

[
{'user': 'joe', 'IndexUsed': 'a'}, 
{'user': 'joe', 'IndexUsed': 'a'},
{'user': 'joe', 'IndexUsed': 'a'},
{'user': 'joe', 'IndexUsed': 'b'}, 
{'user': 'admin', 'IndexUsed': 'a'}, 
{'user': 'admin', 'IndexUsed': 'c'},
{'user': 'hugo', 'IndexUsed': 'a'},
{'user': 'hugo', 'IndexUsed': 'd'},
...
]
Run Code Online (Sandbox Code Playgroud)

我希望我的最终结果如下所示:

[
{'user': 'joe', 'IndexUsed': ['a', 'b']}, 
{'user': 'admin', 'IndexUsed': ['a', 'c']}, 
{'user': 'hugo', 'IndexUsed': ['a', 'd']},
]
Run Code Online (Sandbox Code Playgroud)

从本质上讲,合并/重复删除中的唯一字段IndexUsed并将它们减少到每个字典只有一个user

我已经研究过使用减速器、字典理解并在 StackOverflow 上进行搜索,但是我在使用字符串查找用例时遇到了一些麻烦。我发现的大多数示例都使用整数将它们组合成最终的 int/float,但在这里我更愿意将它组合成一个最终的字符串。你能帮我理解如何解决这个问题吗?

python list python-3.x dictionary-comprehension

6
推荐指数
1
解决办法
186
查看次数