在python2.7 +存在任何方式来做类似的东西:
{ something_if_true if condition else something_if_false for key, value in dict_.items() }
Run Code Online (Sandbox Code Playgroud)
我知道你可以用'if'做任何事情
{ something_if_true for key, value in dict_.items() if condition}
Run Code Online (Sandbox Code Playgroud) 当我创建一个新的javascript数组,并使用整数作为键时,该数组中每个直到整数的元素都被创建为undefined.例如:
var test = new Array();
test[2300] = 'Some string';
console.log(test);
Run Code Online (Sandbox Code Playgroud)
将输出2298 undefined's和一个'Some string'.
我应该如何让javascript使用2300作为字符串而不是整数,或者我应该如何保持它不会实现2299空索引?
有没有已知的方法让ast.literal_eval(node_or_string)的评估实际上不安全?
如果是,是否可以使用补丁?
(我已经知道PyPy [沙盒],它可能更安全,但除非答案是肯定的,否则,我的需求很小,我不会走得那么远.)
我的问题与这个问题非常相似,除了我有一个列表字典,我有兴趣将键值和每个列表形式的所有元素都更改string为int.
所以例如我喜欢这本词典:
{ '1':['1', '2', '3', '4'] , '2':['1', '4'] , '3':['43','176'] }
Run Code Online (Sandbox Code Playgroud)
成为:
{ 1:[1, 2, 3, 4] , 2:[1, 4] , 3:[43,176] }
Run Code Online (Sandbox Code Playgroud)
这可能吗?
更常见的是因为我从JSON格式文件创建了这个字典
{"0":["1","2","3","4"],"1":["0","2","3","4","27","94 ","95","97","128","217","218","317","2":["0","1","3","4","94 ","95"],"3":["0","1","2","4","377"],"4":["0","1","2", "3","27","28"],"5":["6","7","8"],"6":["5","7","8"]," 7":["5","6","8","14","23","40","74","75","76","362","371","372 "],"8":["5","6","7","66"],"9":["10","11","12"],"10":["9 ","11","12","56","130","131"]}
按照以下说明操作:
json_data = open("coauthorshipGraph.txt")
coautorshipDictionary = json.load( json_data )
json_data.close()
Run Code Online (Sandbox Code Playgroud)
有没有办法在加载时直接做到这一点?
根据这个转换表,当使用JSON模块进行序列化时,Python int会被编写为JSON数字 - 正如我所期望的那样.
我有一个带整数键和整数值的字典:
>>> d = {1:2}
>>> type(d.items()[0][0])
<type 'int'>
>>> type(d.items()[0][1])
<type 'int'>
Run Code Online (Sandbox Code Playgroud)
当我使用json模块将其序列化为JSON字符串时,该值被写为数字,但键被写为字符串:
>>> json.dumps(d)
'{"1": 2}'
Run Code Online (Sandbox Code Playgroud)
这不是我想要的行为,它似乎特别破碎,因为它打破了json.dumps/json.loads round-tripping:
>>> d == json.loads(json.dumps(d))
False
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,有没有办法可以强制将密钥写成数字?
我试图以一种可以在外部表单中读取它们的方式序列化我的对象,并找到了 jsonpickle。但事实证明它将我的字典键从整数转换为字符串。
我注意到这个线程只使用 JSON 包来解决这个问题,但我希望 jsonpickle 能够解决这个问题。有任何已知的解决方法吗?或者是否有更好的文本模式序列化格式可用于 Python?
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
>>> a={}
>>> a[11]="eleventy"
>>> a[22]="twice that"
>>> a
{11: 'eleventy', 22: 'twice that'}
>>> import jsonpickle
>>> jstring=jsonpickle.encode(a)
>>> jstring
'{"22": "twice that", "11": "eleventy"}'
>>> b=jsonpickle.decode(jstring)
>>> b
{'22': 'twice that', '11': 'eleventy'}
>>>
Run Code Online (Sandbox Code Playgroud)
更新:短期内我的工作是拥有并行保存功能——一个用于 pickle,一个用于 jsonpickle。由于我的对象很复杂(循环引用),我无法摆脱无法处理的对象。我最初的要求是拥有一种可以在文本编辑器中读取的格式,这样我就可以检测逻辑问题,只要常规 pickel 是可靠的(它是),那么现在就可以了。有一天我可能想让其他一些非 Python 软件吃掉这个文件,所以我想找到一个可用的解决方案。XML 格式?Python 社区似乎对序列化为 XML 不太感兴趣。至少我还没有找到一个像 pickle/jsonpickle 一样容易工作的包。
众所周知,json将 dict 的整数键转换为字符串:
import json
print json.dumps({1: [2.5, 2.5, 2.5], 2: [3, 3, 3, 3]})
# {"1": [2.5, 2.5, 2.5], "2": [3, 3, 3, 3]}
Run Code Online (Sandbox Code Playgroud)
加载时恢复整数键的最干净的方法是什么?
d = json.loads('{"1": [2.5, 2.5, 2.5], "2": [3, 3, 3, 3]}')
print d
# {u'1': [2.5, 2.5, 2.5], u'2': [3, 3, 3, 3]}
Run Code Online (Sandbox Code Playgroud)
我在想:
d = {int(k): d[k] for k in d}
Run Code Online (Sandbox Code Playgroud)
但是有没有一种更简洁的方法来处理带有 JSON/Python 的整数键的字典,而不需要后验的键转换?