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

How to use generator expression with tuples in python

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

关于如何有效地做到这一点有什么想法吗?

这有点神秘,但可以使用推导式完全按照您的意愿执行,假设变量 poly 开始时包含您的原始值:

print( {pkey:{n:(v[n],v[n+1]) for n in range(1,len(v),2)} for pkey,v in poly.items()} )

总的来说,我会说这不是很 "Pythonic" 因为它有点难读。我很想访问您的原始数据结构,看看您是否创建了一个 class 以某种方式封装行为。

你可以这样做:

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

这是第一个字典键的示例:

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