我有“ 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
答案 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)