Python实现三维数据(x, y, z)的索引——即通过(x, y)的值索引z的值

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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北极熊在南极_whl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值