如何在python中使用带有元组的生成器表达式

时间:2015-09-10 02:13:56

标签: python dictionary tuples generator

我是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... 

有关如何有效地做到这一点的任何想法?

3 个答案:

答案 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)}}