我是python的新手所以我试图弄清楚如何使用带有整数元组的生成器表达式。
我有以下结构:
多边形数量:3
被阻止的多边形:
{
0:(6, 192, 365, 172, 388, 115, 378, 127, 311, 142, 305, 192, 334),
1:(4, 172, 688, 115, 678, 105, 650, 107, 634),
2:(6, 242, 294, 215, 278, 205, 250, 242, 205, 284, 221, 292, 234)
}
Blocked Polygons是一个字典对象
第一项6, 192, 365...etc..
其中6是该列表中的坐标数。
我想将其转换为坐标词典的字典,如下所示:
{
0:{
0:(192, 365),
1:(172, 388),
2:(115, 378),
3:(127, 311),
4:(142, 305),
5:(192, 334)
},
}, etc...
有关如何有效地做到这一点的任何想法?
答案 0 :(得分:2)
这是一种方式,示例显示第一个字典键:
data = {
0: (6, 192, 365, 172, 388, 115, 378, 127, 311, 142, 305, 192, 334),
1: (4, 172, 688, 115, 678, 105, 650, 107, 634),
2: (6, 242, 294, 215, 278, 205, 250, 242, 205, 284, 221, 292, 234)
}
it = iter(data[0][1:])
result = dict(enumerate(zip(it, it)))
from pprint import pprint
pprint(result)
<强>输出强>
{0: (192, 365), 1: (172, 388), 2: (115, 378), 3: (127, 311), 4: (142, 305), 5: (192, 334)}
您可以像data
那样执行所有键:
results = {}
for k, v in data.items():
it = iter(v[1:])
results.update({k: dict(enumerate(zip(it, it)))})
pprint(results)
<强>输出强>
{0: {0: (192, 365), 1: (172, 388), 2: (115, 378), 3: (127, 311), 4: (142, 305), 5: (192, 334)}, 1: {0: (172, 688), 1: (115, 678), 2: (105, 650), 3: (107, 634)}, 2: {0: (242, 294), 1: (215, 278), 2: (205, 250), 3: (242, 205), 4: (284, 221), 5: (292, 234)}}
答案 1 :(得分:1)
这有点神秘,但假设变量poly
开始包含原始值,则会完全按照你想要的方式使用理解:
print( {pkey:{n:(v[n],v[n+1]) for n in range(1,len(v),2)} for pkey,v in poly.items()} )
总的来说,我说的不是#34; Pythonic&#34;因为它有点难以阅读。我很想访问你的原始数据结构,看看你是否创建了一个以某种方式封装行为的类。
答案 2 :(得分:1)
你可以这样做:
d = {
0: (6, 192, 365, 172, 388, 115, 378, 127, 311, 142, 305, 192, 334),
1: (4, 172, 688, 115, 678, 105, 650, 107, 634),
2: (6, 242, 294, 215, 278, 205, 250, 242, 205, 284, 221, 292, 234)
}
pprint({k: dict(enumerate(zip(vs[1::2], vs[2::2]))) for k, vs in d.iteritems()})
请注意,除非您需要进行一些错误检查,否则可以忽略每个元组中的第一个元素。
输出:
{0: {0: (192, 365),
1: (172, 388),
2: (115, 378),
3: (127, 311),
4: (142, 305),
5: (192, 334)},
1: {0: (172, 688), 1: (115, 678), 2: (105, 650), 3: (107, 634)},
2: {0: (242, 294),
1: (215, 278),
2: (205, 250),
3: (242, 205),
4: (284, 221),
5: (292, 234)}}