根据字典的坐标将值添加到字典

时间:2019-11-18 00:41:46

标签: python

我有“ n”个数字,我必须创建一个字典(其中n为长度和宽度为i / n)以形成字典。

假设我有“ n” = 4

  y  0.25  0.5  0.75                 
0.25
0.5
0.75

# code 
data = {"y/x": []}
for i in range(n):
    data["y/x"].append(i/n)
    data[i/n] = []

一旦生成字典,我就有一个列表(永远是偶数),您最多必须生成N / 2对。

List given
nums = [0.60365, 0.83799, 0.32960, 0.19322, 0.11220,
        0.37751, 0.88492, 0.30934, 0.22888, 0.78212]

坐标

coord = [(0.60365, 0.83799), (0.3296, 0.19322), (0.1122, 0.37751), (0.88492, 0.30934), (0.22888, 0.78212)]

#code
coord = [((nums[i]), (nums[i+1]) % len(nums))
         for i in range(0, len(nums), 2) if i < len(nums)-1]
print(coord)

如何放置字典间隔内的对数?以这种方式?**

    y/x      0 ->0.25   .25 -> .5   .5 -> .75   .75 -> 1
 0  -> 0.25     1            1          0            0
.25 -> .5       1            2          0            1
.5  -> .75      0            0          0            1
.75 -> 1        0            1          1            0

2 个答案:

答案 0 :(得分:0)

首先,您将构建具有与任务中的范围一样多的元素的字典。 其次,我们将定义一个新列表,其中包含字典的范围值边界。每个列表元素的索引等于字典中相应的坐标。

通过这种方式,我们可以清晰,轻松地跟踪字典中的键以及对字典键进行解码的列表或值。

n = 4

dict = {}
for i in range(1, n+1):
  dict[i/n] = {}
  for j in range(1, n+1):
    dict[i/n][j/n] = 0
print(dict)

和印刷品:

[0.25, 0.5, 0.75, 1.0]
{0: {0: 0, 1: 0, 2: 0, 3: 0}, 1: {0: 0, 1: 0, 2: 0, 3: 0}, 2: {0: 0, 1: 0, 2: 0, 3: 0}, 3: {0: 0, 1: 0, 2: 0, 3: 0}}

接下来,您将浏览输入列表并标记坐标。 这样做的逻辑是,您需要将1放入字典中的字典键下,该键由范围数组中满足以下条件prev_range_element < value <= current_range_element的第一个元素表示。

当我们知道我们要做什么时,让我们将初始列表转换为tupples列表。我的方法绝对不是最好的方法,但必须适合此答案。

# turn the list into a set of coordinates
zipped_nums = [v for k,v in enumerate(zip(nums, nums[1:])) if k % 2 == 0 ]
print(zipped_nums)

导致

[(0.60365, 0.83799), (0.3296, 0.19322), (0.1122, 0.37751), (0.88492, 0.30934), (0.22888, 0.78212)]

最后,我们运行一个循环,检查我们上面定义的条件。我在这里选择了一个简单的n ^ 2解决方案,随时可以优化:)

for num in zipped_nums:
  x = y = prev_range = 0
  for idx, range in enumerate(ranges):
    if num[0] <= range and num[0] > prev_range:
      x = idx
    if num[1] <= range and num[1] > prev_range:
      y = idx
    prev_range = range
  print(''+str(x) + ' ' + str(y))
  dict[x][y] += 1

最终导致

{0: {0: 0, 1: 1, 2: 0, 3: 1}, 1: {0: 1, 1: 0, 2: 0, 3: 0}, 2: {0: 0, 1: 0, 2: 0, 3: 1}, 3: {0: 0, 1: 1, 2: 0, 3: 0}}

您现在要做的就是将结果呈现在一个漂亮的表中,但这是另一个故事了。

干杯〜

答案 1 :(得分:0)

我使用了pandas(最常用的python库之一),正如我在评论中提到的建议那样。我根本没用你的字典。

import pandas as pd

n = 4

nums = [0.60365, 0.83799, 0.32960, 0.19322, 0.11220,
        0.37751, 0.88492, 0.30934, 0.22888, 0.78212]

coord = [((nums[i]), (nums[i+1]) % len(nums))
         for i in range(0, len(nums), 2) if i < len(nums)-1]

# my code
borders = [0.25*i for i in range(n + 1)]
borders_as_string = list(str(borders[i]) + ' --> ' + str(borders[i + 1]) for i in range(len(borders) - 1))

values = [[0 for i in range(n)] for j in range(n)]

for c in coord:
    x = int(c[0]//0.25)
    y = int(c[1]//0.25)
    values[x][y] += 1

dataframe = pd.DataFrame(values, borders_as_string, borders_as_string)

print(dataframe)

结果将是:

              0.0 --> 0.25  0.25 --> 0.5  0.5 --> 0.75  0.75 --> 1.0
0.0 --> 0.25             0             1             0             1
0.25 --> 0.5             1             0             0             0
0.5 --> 0.75             0             0             0             1
0.75 --> 1.0             0             1             0             0

这将扩展为任意数量的数字,例如,您可以尝试:

import numpy as np
nums = np.random.rand(100)
相关问题