如何在 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)}}
我是 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)}}