是的,我知道这个主题已经被覆盖过了(这里,这里,这里,这里),但据我所知,除了一个之外,所有解决方案都在这样的列表中失败:
L = [[[1, 2, 3], [4, 5]], 6]
Run Code Online (Sandbox Code Playgroud)
期望的输出是什么
[1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)
或者甚至更好,一个迭代器.我看到的唯一适用于任意嵌套的解决方案可以在这个问题中找到:
def flatten(x):
result = []
for el in x:
if hasattr(el, "__iter__") and not isinstance(el, basestring):
result.extend(flatten(el))
else:
result.append(el)
return result
flatten(L)
Run Code Online (Sandbox Code Playgroud)
这是最好的型号吗?我忽略了什么吗?任何问题?
如果我有2个dicts如下:
d1 = {('unit1','test1'):2,('unit1','test2'):4}
d2 = {('unit1','test1'):2,('unit1','test2'):''}
Run Code Online (Sandbox Code Playgroud)
为了"合并"它们:
z = dict(d1.items() + d2.items())
z = {('unit1','test1'):2,('unit1','test2'):''}
Run Code Online (Sandbox Code Playgroud)
工作良好.另外要做什么,如果我想比较两个词典的每个值,如果d1中的值为空/无/',则只将d2更新为d1?
[编辑] 问题:当将d2更新为d1时,当存在相同的键时,我想仅保持数值(来自d1或d2)而不是空值.如果两个值都为空,那么保持空值没有问题.如果两者都有值,则应保留d1值.:)(lota if-else ..我会在此期间尝试自己)
即
d1 = {('unit1','test1'):2,('unit1','test2'):8,('unit1','test3'):''}
d2 = {('unit1','test1'):2,('unit1','test2'):'',('unit1','test3'):''}
#compare & update codes
z = {('unit1','test1'):2,('unit1','test2'):8, ('unit1','test2'):''} # 8 not overwritten by empty.
Run Code Online (Sandbox Code Playgroud)
请帮忙建议.
谢谢.
我有下面的代码,目前只打印初始字典的值.但是,我想迭代嵌套字典的每个键,最初只打印名称.请参阅下面的代码:
Liverpool = {
'Keepers':{'Loris Karius':1,'Simon Mignolet':2,'Alex Manninger':3},
'Defenders':{'Nathaniel Clyne':3,'Dejan Lovren':4,'Joel Matip':5,'Alberto Moreno':6,'Ragnar Klavan':7,'Joe Gomez':8,'Mamadou Sakho':9}
}
for k,v in Liverpool.items():
if k =='Defenders':
print(v)
Run Code Online (Sandbox Code Playgroud) 对于没有浮点数的字典,我们使用简单的a == bwherea和bare python 字典。这很有效,直到我们最终在其中某处得到a并b包含浮点数。它们是嵌套字典,所以我认为这会带来pytest.approx麻烦。
我们想要的是告诉我们这两个字典相等(或近似相等,但仅在浮点近似时不会失败)的东西:
{"foo": {"bar": 0.30000001}} == {"foo": {"bar": 0.30000002}}
pytest.approx()几乎是我想要的,但它不支持嵌套字典。有什么东西可以做我想做的事吗?
我有一个嵌套的python dictionary数据结构.我想without用collection模块读取它的键和值.数据结构如下所示.
d = {'dict1': {'foo': 1, 'bar': 2}, 'dict2': {'baz': 3, 'quux': 4}}
Run Code Online (Sandbox Code Playgroud)
我试图使用波纹管方式读取字典中的键但得到错误.
码
for key, value in d:
print(Key)
Run Code Online (Sandbox Code Playgroud)
错误
ValueError: too many values to unpack (expected 2)
Run Code Online (Sandbox Code Playgroud)
所以任何人都可以解释错误背后的原因以及如何遍历字典.
我正在使用Python Simple-Salesforce通过SOQL查询数据.我知道SOQL语法中不支持"SELECT*",所以我想创建一个Python脚本来收集要插入SELECT语句的所有字段的字符串列表.以下是我描述帐户对象的方式:
from simple_salesforce import Salesforce
from simple_salesforce import SFType
#(credentials hidden)
sf = Salesforce(username=username, password=password,
security_token=security_token, sandbox=True,
client_id='mwheeler App')
desc = sf.Account.describe()
print(desc)
Run Code Online (Sandbox Code Playgroud)
如何从下面显示的有序词典中将字段名称提取到字符串列表中?
desc:
OrderedDict([('actionOverrides',[]),('activateable',False),('childRelationships',[OrderedDict([('cascadeDelete',False),('childSObject','Account'),('deprecatedAndHidden ',False),('field','ParentId'),('junctionIdListNames',[]),('junctionReferenceTo',[]),('relationshipName','ChildAccounts'),('restrictedDelete',False) ]),OrderedDict([('cascadeDelete',True),('childSObject','AccountCleanInfo'),('deprecatedAndHidden',False),('field','AccountId'),......
我将使用字符串列表来选择所有字段:
query = sf.query_all("SELECT string_list FROM Account")
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用由 PostgreSQL 数据库构成的旧事件存储中的数据填充 DynamoDB 数据库。在它运行了很大一部分 db 条目后,尝试调用该put_item函数时会抛出此错误。
botocore.exceptions.ClientError:-
调用 PutItem 操作时发生错误 (ValidationException):一个或多个参数值无效:一个 AttributeValue 可能不包含空字符串
我决定重新运行代码并通过在插入之前转储所有表属性来查看发生了什么。
我可以看到唯一的“空字符串”在answer_string字典的属性中,称为details,见下文:-
Importing event type 5 completed by user: 1933
1933 5 {'answer': {'difficulty': 1, 'answer_string': ''}, 'card_id': n
'13448', 'review_id': '153339', 'time_spent': 2431}
62 153339
2017-01-18 00:46:48.373009+00:00 2017-01-18 00:46:48.364217+00:00
Run Code Online (Sandbox Code Playgroud)
我很确定这就是导致抛出错误的原因,因为其他表属性都不正确。
我的问题是details字典可以来自几十个不同的位置,每个details字典可以有不同的属性 - 具有answer_string属性的只是许多可能的字典配置之一。我不可能检查字典的所有可能配置并验证它们都没有空字符串。
有没有一种方法可以对字典进行一次全面检查,看看它的任何部分是否为空?
我正在使用以下字符串:
'"name": "Gnosis", \n "symbol": "GNO", \n "rank": "99", \n "price_usd": "175.029", \n "price_btc": "0.0186887", \n "24h_volume_usd": "753877.0"'
Run Code Online (Sandbox Code Playgroud)
并且我必须re.sub()在 python 中使用仅替换"包含数字的双引号 ( ),以便稍后在 JSON 中解析它。我试过一些正则表达式,但没有成功。这是我最好的尝试:
exp = re.compile(r': (")\D+\.*\D*(")', re.MULTILINE)
response = re.sub(exp, "", string)
Run Code Online (Sandbox Code Playgroud)
我已经搜索了很多类似的问题,但没有找到另一个类似的问题。
最后我使用了(感谢S. Kablar):
fomatted = re.sub(r'"(-*\d+(?:\.\d+)?)"', r"\1", string)
parsed = json.loads(formatted)
Run Code Online (Sandbox Code Playgroud)
问题是此端点以 JSON 形式返回格式错误的字符串。
其他用户使用 for 循环回答“首先用 json 解析字符串,然后将数字转换为浮点数”,我认为这是一种非常低效的方法,此外,您将被迫在 int 或 float 类型之间进行选择你的回应。毫无疑问,我已经写了这篇要点,向您展示了不同方法与基准测试之间的比较,现在我将在这种情况下信任正则表达式。
谢谢大家的帮助
我有一个输入,整数。我用它们构建了一个字典(作为值)。然后我将它转储到 JSON,以便在其他地方重用。
我最终(在“其他地方”)需要将这些整数用作字符串。因此我可以进行转换
无论解决方案如何,str()代码中都会有很多。我正在寻找一种更简洁的方法来将所有内容转换int为str特定情况下的内容。
一种想法是在 dict构建后递归解析它,就在 之前json.dumps(),并在那里进行转换。不过,我想知道,在转储 JSON 时是否没有办法处理这个问题?可能使用json.JSONEncoder吗?(坦率地说,我不太明白)
我有一个像下面这样的json:
{"widget": {
"debug": "on",
"window": {
"title": "SampleWidget",
"name": "main_window",
"width": 500,
"height": 500
},
"image": {
"src": "Images/Sun.png",
"name": "sun1",
"hOffset": 250,
"vOffset": 250,
"alignment": "center"
},
"text": {
"data": "Click Here",
"size": 36,
"style": "bold",
"name": "text1",
"hOffset": 250,
"vOffset": 100,
"alignment": "center",
"onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
}
}}
Run Code Online (Sandbox Code Playgroud)
我需要提取所有的键值对。例如debug=on,title=SampleWidget,name=main_window等等。我怎样才能以通用方式做到这一点?我的意思是 json 可以是示例中的 json 以外的任何其他内容,但过程应该是相同的。
我发现自己制作多级词典相当多。我总是不得不编写非常冗长的代码来遍历包含大量临时变量的字典的所有级别。
有没有办法概括这个函数来迭代多个级别而不是硬编码并手动指定有多少级别?
def iterate_multilevel_dictionary(d, number_of_levels):
# How to auto-detect number of levels?
# number_of_levels = 0
if number_of_levels == 1:
for k1, v1 in d.items():
yield k1, v1
if number_of_levels == 2:
for k1, v1 in d.items():
for k2, v2 in v1.items():
yield k1, k2, v2
if number_of_levels == 3:
for k1, v1 in d.items():
for k2, v2 in v1.items():
for k3, v3 in v2.items():
yield k1, k2, k3, v3
# Level 1
d_level1 = {"a":1,"b":2,"c":3}
for items in iterate_multilevel_dictionary(d_level1, …Run Code Online (Sandbox Code Playgroud) 我希望能够在可以设置的选项列表中转换字典(使用完整路径),例如,这应该通过:
def test_dic_to_args(self):
dic = {"x1": {"x2": "val1"}, "x2": "val3"}
des = ["x1.x2:val1", "x2:val3"]
self.assertEqual(conf.dict_to_args(dic), des)
Run Code Online (Sandbox Code Playgroud)
现在我开始编写它,我认为它很简单,但它比我想象的更棘手,有队列,类型检查等等.有没有一种聪明的方法来解决这个问题?也许最好的选择仍然是递归DFS,你怎么看?
python ×12
dictionary ×7
json ×2
amazon-s3 ×1
boto ×1
compare ×1
flatten ×1
function ×1
generator ×1
iterable ×1
list ×1
merge ×1
nested ×1
optimization ×1
pytest ×1
python-3.x ×1
regex ×1
salesforce ×1
soql ×1