所以我将这些元组放在另一个元组的两个列表中,看起来像
data_tuple = ([(1,2,3),(4,5,6)(7,8,9)],[(a,b,c),(d,e,f)(g,h,i)])
我想使用每个列表中相应的索引元素构建一组坐标,使其看起来像
final = [(2,b),(5,e),(8,h)]
这是我得到的:
for a in data_tuple[0]:
x = a[1]
for b in data_tuple[1]:
y = b[1]
print(x,y)
现在我只想检查我的迭代/缩进是否正确所以我还不需要将它们放入列表中。现在这个特定代码的结果是
(2,b)
(2,e)
(2,h)
(5,b)
(5,e)
依此类推,直到达到(8,h)。
如果我把打印线放到左边,在第二个for循环下,我得到
(2,h)
(5,h)
(8,h)
我该如何解决这个问题?对不起,如果我没有任何意义= /。你可以告诉我,我对Python非常陌生,所以我不熟悉很多导入模块。有什么帮助吗?
答案 0 :(得分:2)
>>> print [(i[0][1],i[1][1]) for i in zip(*data_tuple)]
[(2, 'b'), (5, 'e'), (8, 'h')]
但通常清晰度比简洁更重要
我真的不明白你原来的问题,因为它看起来像预期的那样工作意味着你的缩进和迭代很好..
[edit]这就是你想要的东西
for i in range(len(data_tuple[0]):
x,y = data_tuple[0][i][1],data_tuple[1][i][1],
print (x,y)
或
>>> for numbr,letr in zip(*data_tuple):
... x,y = numbr[1],letr[1]
... print(x,y)
...
答案 1 :(得分:0)
这样的东西?
>>> data_tuple = ([(1,2,3),(4,5,6),(7,8,9)],[("a","b","c"),("d","e","f"),("g","h","i")])
>>> full_numbers_list, full_letters_list = data_tuple
>>> desired_output_idx = (1,)
>>>
>>> results = []
>>> for numbers, letters in zip(full_numbers_list, full_letters_list):
... assert len(numbers) == len(letters) # make sure assumption is met
... for i in range(len(numbers)):
... if i in desired_output_idx:
... results.append((numbers[i], letters[i]))
...
>>> results
[(2, 'b'), (5, 'e'), (8, 'h')]
代替使用解压缩data_tuple
的步骤,您可以使用*data_tuple
解压缩您的元组以输入zip()
函数。
>>> zip(*data_tuple)
[((1, 2, 3), ('a', 'b', 'c')), ((4, 5, 6), ('d', 'e', 'f')), ((7, 8, 9), ('g', 'h', 'i'))]
>>>
>>> # *data_tuple is the same as:
>>> numbers, letters = data_tuple
>>> zip(numbers, letters)
[((1, 2, 3), ('a', 'b', 'c')), ((4, 5, 6), ('d', 'e', 'f')), ((7, 8, 9), ('g', 'h', 'i'))]
答案 2 :(得分:0)
假设你总是想要第二个元素:
[ (a, b) for ((_,a,_), (_,b,_)) in zip(*data_tuple) ]
请注意,这会产生您指定的结果,但与您的算法不同,后者会产生笛卡尔积。这样就可以实现:
[ (a, b)
for (_,a,_) in data_tuple[0]
for (_,b,_) in data_tuple[1] ]
假设你总是想要第二个元素:
[ (a, b) for ((_,a,_), (_,b,_)) in zip(*data_tuple) ]
请注意,这会产生您指定的结果,但与您的算法不同,后者会产生笛卡尔积。这样就可以实现:
[ (a, b)
for (_,a,_) in data_tuple[0]
for (_,b,_) in data_tuple[1] ]
编辑:在回复您的评论时,这是我运行的会话:
>>> [ (a, b)
... for (_,a,_) in data_tuple[0]
... for (_,b,_) in data_tuple[1] ]
[(2, 'b'), (2, 'e'), (2, 'h'), (5, 'b'), (5, 'e'), (5, 'h'), (8, 'b'), (8, 'e'), (8, 'h')]
这是笛卡尔产品,根据您的原始代码。
然而,根据您修正的问题,我很确定您只想要我提供的第一个代码:
>>> [ (a, b) for ((_,a,_), (_,b,_)) in zip(*data_tuple) ]
[(2, 'b'), (5, 'e'), (8, 'h')]