Python实现三维数据(x, y, z)的索引——即通过(x, y)的值索引z的值
一、需求分析
1、通常情况下我们对于二维数据(x, y)的存储,表示和索引,可以用字典来满足我们的需求,比如下列一组二维数据:
x = [1, 2, 3, 4, 5, 6, 7, 8]
y = ['Tomato', 'Potato', 'Apple', 'Pear', 'Lemon', 'Watermelon', 'Orange', 'Peach']
Second_Dimension_Data = dict(zip(x, y))
print('Second_Dimension_Data:', Second_Dimension_Data)
输出结果如下:
Second_Dimension_Data: {1: 'Tomato', 2: 'Potato', 3: 'Apple', 4: 'Pear', 5: 'Lemon', 6: 'Watermelon', 7: 'Orange', 8: 'Peach'}
1.1、情况一:通过x的值索引y的值,也即通过字典Second_Dimension_Data的key索引value,如下:
for i in x:
print('key{}对应的value为:{}'.format(i, Second_Dimension_Data[i]))
输出结果如下:
key1对应的value为:Tomato
key2对应的value为:Potato
key3对应的value为:Apple
key4对应的value为:Pear
key5对应的value为:Lemon
key6对应的value为:Watermelon
key7对应的value为:Orange
key8对应的value为:Peach
1.2、情况二:通过y的值索引x的值,也即通过字典Second_Dimension_Data的value索引key,如下:
(1)value值有重复的情况(两种方法)。比如上述字典变为:
x = [1, 2, 3, 4, 5, 6, 7, 8]
y = ['Tomato', 'Potato', 'Apple', 'Pear', 'Lemon', 'Watermelon', 'Orange', 'Apple']
Second_Dimension_Data = dict(zip(x, y))
print('Second_Dimension_Data:', Second_Dimension_Data)
for i in x:
print('key{}对应的value为:{}'.format(i, Second_Dimension_Data[i]))
输出结果为:
Second_Dimension_Data: {1: 'Tomato', 2: 'Potato', 3: 'Apple', 4: 'Pear', 5: 'Lemon', 6: 'Watermelon', 7: 'Orange', 8: 'Apple'}
key1对应的value为:Tomato
key2对应的value为:Potato
key3对应的value为:Apple
key4对应的value为:Pear
key5对应的value为:Lemon
key6对应的value为:Watermelon
key7对应的value为:Orange
key8对应的value为:Apple
法一:完整代码如下:
x = [1, 2, 3, 4, 5, 6, 7, 8]
y = ['Tomato', 'Potato', 'Apple', 'Pear', 'Lemon', 'Watermelon', 'Orange', 'Apple']
Second_Dimension_Data = dict(zip(x, y))
print('Second_Dimension_Data:', Second_Dimension_Data)
for i in x:
print('key{}对应的value为:{}'.format(i, Second_Dimension_Data[i]))
getvalue = input('请输入value:')
index = 0
for i in Second_Dimension_Data.values():
if getvalue == i:
print('value:{}对应的key为:{}'.format(i, list(Second_Dimension_Data.keys())[index]))
index += 1
输出结果如下:
Second_Dimension_Data: {1: 'Tomato', 2: 'Potato', 3: 'Apple', 4: 'Pear', 5: 'Lemon', 6: 'Watermelon', 7: 'Orange', 8: 'Apple'}
key1对应的value为:Tomato
key2对应的value为:Potato
key3对应的value为:Apple
key4对应的value为:Pear
key5对应的value为:Lemon
key6对应的value为:Watermelon
key7对应的value为:Orange
key8对应的value为:Apple
请输入value:Apple
value:Apple对应的key为:3
value:Apple对应的key为:8
法二:利用字典方法items,完整代码如下:
x = [1, 2, 3, 4, 5, 6, 7, 8]
y = ['Tomato', 'Potato', 'Apple', 'Pear', 'Lemon', 'Watermelon', 'Orange', 'Apple']
Second_Dimension_Data = dict(zip(x, y))
print('Second_Dimension_Data:', Second_Dimension_Data)
for i in x:
print('key{}对应的value为:{}'.format(i, Second_Dimension_Data[i]))
getvalue = input('请输入value:')
for key, value in Second_Dimension_Data.items():
if getvalue == value:
print('value:{}对应的key为:{}'.format(value, key))
输出结果为:
Second_Dimension_Data: {1: 'Tomato', 2: 'Potato', 3: 'Apple', 4: 'Pear', 5: 'Lemon', 6: 'Watermelon', 7: 'Orange', 8: 'Apple'}
key1对应的value为:Tomato
key2对应的value为:Potato
key3对应的value为:Apple
key4对应的value为:Pear
key5对应的value为:Lemon
key6对应的value为:Watermelon
key7对应的value为:Orange
key8对应的value为:Apple
请输入value:Apple
value:Apple对应的key为:3
value:Apple对应的key为:8
(2)value值没有重复的情况(两种方法)。
法一:完整代码如下:
x = [1, 2, 3, 4, 5, 6, 7, 8]
y = ['Tomato', 'Potato', 'Apple', 'Pear', 'Lemon', 'Watermelon', 'Orange', 'Peach']
Second_Dimension_Data = dict(zip(x, y))
print('Second_Dimension_Data:', Second_Dimension_Data)
for i in x:
print('key{}对应的value为:{}'.format(i, Second_Dimension_Data[i]))
getvalue = input('请输入value:')
for i in Second_Dimension_Data.values():
if getvalue == i:
index = list(Second_Dimension_Data.values()).index(i)
print('value:{}对应的key为:{}'.format(i, list(Second_Dimension_Data.keys())[index]))
输出结果如下:
Second_Dimension_Data: {1: 'Tomato', 2: 'Potato', 3: 'Apple', 4: 'Pear', 5: 'Lemon', 6: 'Watermelon', 7: 'Orange', 8: 'Peach'}
key1对应的value为:Tomato
key2对应的value为:Potato
key3对应的value为:Apple
key4对应的value为:Pear
key5对应的value为:Lemon
key6对应的value为:Watermelon
key7对应的value为:Orange
key8对应的value为:Peach
请输入value:Apple
value:Apple对应的key为:3
法二:利用字典方法items,完整代码如下:
x = [1, 2, 3, 4, 5, 6, 7, 8]
y = ['Tomato', 'Potato', 'Apple', 'Pear', 'Lemon', 'Watermelon', 'Orange', 'Peach']
Second_Dimension_Data = dict(zip(x, y))
print('Second_Dimension_Data:', Second_Dimension_Data)
for i in x:
print('key{}对应的value为:{}'.format(i, Second_Dimension_Data[i]))
getvalue = input('请输入value:')
for key, value in Second_Dimension_Data.items():
if getvalue == value:
print('value:{}对应的key为:{}'.format(value, key))
输出结果如下:
Second_Dimension_Data: {1: 'Tomato', 2: 'Potato', 3: 'Apple', 4: 'Pear', 5: 'Lemon', 6: 'Watermelon', 7: 'Orange', 8: 'Peach'}
key1对应的value为:Tomato
key2对应的value为:Potato
key3对应的value为:Apple
key4对应的value为:Pear
key5对应的value为:Lemon
key6对应的value为:Watermelon
key7对应的value为:Orange
key8对应的value为:Peach
请输入value:Apple
value:Apple对应的key为:3
2、特殊情况下我们需要对三维数据(x, y, z)进行存储,表示和索引,这样的话,单纯用字典已经满足不了我们的需求,比如下列一组三维数据:
x = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8]
y = [2, 126, 65, 28, 9, 513, 344, 217, 2, 126, 65, 28, 9, 513, 344, 217]
z = ['Tomato', 'Potato', 'Apple', 'Pear', 'Lemon', 'Watermelon', 'Orange', 'Peach', \
'Tomato', 'Potato', 'Apple', 'Pear', 'Lemon', 'Watermelon', 'Orange', 'Peach']
Third_Dimension_Data = list(zip(x, y, z))
print('Third_Dimension_Data:', Third_Dimension_Data)
输出结果如下:
Third_Dimension_Data: [(1, 2, 'Tomato'), (2, 126, 'Potato'), (3, 65, 'Apple'), (4, 28, 'Pear'), (5, 9, 'Lemon'), (6, 513, 'Watermelon'), (7, 344, 'Orange'), (8, 217, 'Peach'), (1, 2, 'Tomato'), (2, 126, 'Potato'), (3, 65, 'Apple'), (4, 28, 'Pear'), (5, 9, 'Lemon'), (6, 513, 'Watermelon'), (7, 344, 'Orange'), (8, 217, 'Peach')]
2.1、我们现在的需求是:
(1)对y的值进行从小到大排序,同时要求对应位置上的x、z仍然和y的值对应,如下:
排序前Third_Dimension_Data的值为:
Third_Dimension_Data: [(1, 2, 'Tomato'), (2, 126, 'Potato'), (3, 65, 'Apple'), (4, 28, 'Pear'), (5, 9, 'Lemon'), (6, 513, 'Watermelon'), (7, 344, 'Orange'), (8, 217, 'Peach'), (1, 2, 'Tomato'), (2, 126, 'Potato'), (3, 65, 'Apple'), (4, 28, 'Pear'), (5, 9, 'Lemon'), (6, 513, 'Watermelon'), (7, 344, 'Orange'), (8, 217, 'Peach')]
要求排序后Third_Dimension_Data的值为:
Third_Dimension_Data: [(1, 2, 'Tomato'), (1, 2, 'Tomato'), (5, 9, 'Lemon'), (5, 9, 'Lemon'), (4, 28, 'Pear'), (4, 28, 'Pear'), (3, 65, 'Apple'), (3, 65, 'Apple'), (2, 126, 'Potato'), (2, 126, 'Potato'), (8, 217, 'Peach'), (8, 217, 'Peach'), (7, 344, 'Orange'), (7, 344, 'Orange'), (6, 513, 'Watermelon'), (6, 513, 'Watermelon')]
(2)通过x, y的值遍历z的值
完整代码如下:
x = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8]
y = [2, 126, 65, 28, 9, 513, 344, 217, 2, 126, 65, 28, 9, 513, 344, 217]
z = ['Tomato', 'Potato', 'Apple', 'Pear', 'Lemon', 'Watermelon', 'Orange', 'Peach', \
'Tomato', 'Potato', 'Apple', 'Pear', 'Lemon', 'Watermelon', 'Orange', 'Peach']
Third_Dimension_Data = list(zip(x, y, z))
print('Third_Dimension_Data:', Third_Dimension_Data)
Third_Dimension_Data_sorted = sorted(Third_Dimension_Data, key=lambda variable: variable[1])
print('Third_Dimension_Data_sorted:', Third_Dimension_Data_sorted)
Third_Dimension_Data_sorted_split = list(zip(*Third_Dimension_Data_sorted))
x_sorted = Third_Dimension_Data_sorted_split[0]
y_sorted = Third_Dimension_Data_sorted_split[1]
print('y_sorted:', y_sorted)
y_sorted_kind = []
Dict_Third_Dimension_Data = {}
for i in y_sorted:
if i not in y_sorted_kind:
y_sorted_kind.append(i)
# y_sorted_kind = list(set(y_sorted))
print('y_sorted_kind:', y_sorted_kind)
z_sorted = Third_Dimension_Data_sorted_split[2]
for key in y_sorted_kind:
for x_index, y_index in zip(x_sorted, y_sorted):
if key == y_index:
Dict_Third_Dimension_Data.setdefault(key, []).append(x_index)
for key in y_sorted_kind:
for x_index, y_index, z_index in zip(x_sorted, y_sorted, z_sorted):
if key == y_index and x_index in Dict_Third_Dimension_Data[key]:
print(x_index, y_index, z_index)
运行结果如下:
Third_Dimension_Data: [(1, 2, 'Tomato'), (2, 126, 'Potato'), (3, 65, 'Apple'), (4, 28, 'Pear'), (5, 9, 'Lemon'), (6, 513, 'Watermelon'), (7, 344, 'Orange'), (8, 217, 'Peach'), (1, 2, 'Tomato'), (2, 126, 'Potato'), (3, 65, 'Apple'), (4, 28, 'Pear'), (5, 9, 'Lemon'), (6, 513, 'Watermelon'), (7, 344, 'Orange'), (8, 217, 'Peach')]
Third_Dimension_Data_sorted: [(1, 2, 'Tomato'), (1, 2, 'Tomato'), (5, 9, 'Lemon'), (5, 9, 'Lemon'), (4, 28, 'Pear'), (4, 28, 'Pear'), (3, 65, 'Apple'), (3, 65, 'Apple'), (2, 126, 'Potato'), (2, 126, 'Potato'), (8, 217, 'Peach'), (8, 217, 'Peach'), (7, 344, 'Orange'), (7, 344, 'Orange'), (6, 513, 'Watermelon'), (6, 513, 'Watermelon')]
y_sorted: (2, 2, 9, 9, 28, 28, 65, 65, 126, 126, 217, 217, 344, 344, 513, 513)
y_sorted_kind: [2, 9, 28, 65, 126, 217, 344, 513]
1 2 Tomato
1 2 Tomato
5 9 Lemon
5 9 Lemon
4 28 Pear
4 28 Pear
3 65 Apple
3 65 Apple
2 126 Potato
2 126 Potato
8 217 Peach
8 217 Peach
7 344 Orange
7 344 Orange
6 513 Watermelon
6 513 Watermelon
2.2、还有一组相似的三维数据,相似的处理方式如下所示:
完整代码如下:
Die_Y = [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, \
4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6]
Die_X = [4, 5, 6, 7, 8, 9, 10, 11, 12, 4, 5, 6, 7, 4, 5, 6, 7, 8, 4, 5, \
6, 7, 8, 9, 10, 11, 4, 5, 6, 7, 8, 9, 10, 11, 12, 4]
HBin_num = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, \
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
print('HBin_num:', HBin_num)
Die_Y_sort = list(set(Die_Y))
print('Die_Y_sort:', Die_Y_sort)
result_tuple = list(zip(Die_Y, Die_X, HBin_num))
print('result_tuple:', result_tuple)
position_dict = {}
for key in Die_Y_sort:
for die_y, die_x in zip(Die_Y, Die_X):
if key == die_y:
position_dict.setdefault(key, []).append(die_x)
print('position_dict:', position_dict)
# 这里加两级break是为了只索引key==1情况下的值, 验证我们的算法实现的正确性
for key in Die_Y_sort:
for die_y, die_x, hbin_num in zip(Die_Y, Die_X, HBin_num):
if key == die_y and die_x in position_dict[key]:
print(die_y, die_x, hbin_num)
if key == 2:
break
break
运行结果如下:
HBin_num: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
Die_Y_sort: [1, 2, 3, 4, 5, 6]
result_tuple: [(1, 4, 1), (1, 5, 2), (1, 6, 3), (1, 7, 4), (1, 8, 5), (1, 9, 6), (1, 10, 7), (1, 11, 8), (1, 12, 9), (2, 4, 10), (2, 5, 11), (2, 6, 12), (2, 7, 13), (3, 4, 14), (3, 5, 15), (3, 6, 2), (3, 7, 3), (3, 8, 4), (4, 4, 5), (4, 5, 6), (4, 6, 7), (4, 7, 8), (4, 8, 9), (4, 9, 10), (4, 10, 11), (4, 11, 12), (5, 4, 13), (5, 5, 14), (5, 6, 15), (5, 7, 16), (5, 8, 17), (5, 9, 18), (5, 10, 19), (5, 11, 20), (5, 12, 21), (6, 4, 22)]
position_dict: {1: [4, 5, 6, 7, 8, 9, 10, 11, 12], 2: [4, 5, 6, 7], 3: [4, 5, 6, 7, 8], 4: [4, 5, 6, 7, 8, 9, 10, 11], 5: [4, 5, 6, 7, 8, 9, 10, 11, 12], 6: [4]}
1 4 1
1 5 2
1 6 3
1 7 4
1 8 5
1 9 6
1 10 7
1 11 8
1 12 9