既然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)
这将通过首次出现保留排序并消除所有重复.
我想知道社区对这个用例以及一般的订单保留功能的看法.
通过Python的Zen阅读,我很矛盾.该方法很简单,但依赖于隐式排序.
请让我知道你在想什么.谢谢.
我正在使用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
我正在尝试创建一个单词字典和它在字符串中重复的次数.假设字符串如下所示
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)
谁能告诉我语法有什么问题?另外,如何使用字典理解创建这样的字典?
我有以下场景 - 考虑如下的字典列表(输入):
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)
问题:我们可以使用字典理解来做到这一点吗?换句话说,我们可以在字典理解中附加到现有的值列表吗?
我需要提取其值超过某个条件的字典的那些键.基本上,我想这样做,只是以更短,更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)
是否有一个不那么混乱的方式呢?也许显而易见的是我明显失踪了?
谢谢!
给定一串字符,我想创建一个包含在字符串中的所有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中,有列表推导和类似的地图和集合结构.在Kotlin中,任何具有类似名称的文档都没有任何内容.
这些理解的等价物是什么?例如,Python 3 Patterns,Recipes and Idioms中的那些.其中包括对以下方面的理解:
我想使用词典计算单词中所有字母的出现。到目前为止,我已经尝试过为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) 我一直在尝试字典理解,正当我以为我掌握了它的窍门时,我收到了错误: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,但我也找不到答案。
如果有人可以阐明这个主题,或者将我重定向到一篇文章或诸如此类的内容,我将不胜感激。
我不确定我是否以正确的方式提问,但这是我的问题:
我有以下格式的字典列表:
[
{'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,但在这里我更愿意将它组合成一个最终的字符串。你能帮我理解如何解决这个问题吗?