【问题标题】:Select every nth element in list, with n rational/non-integer选择列表中的每个第 n 个元素,有 n 个有理数/非整数
【发布时间】:2020-08-07 01:00:27
【问题描述】:
int_list = list(range(1000))  # list [0, 1, 2, 3, 4, ..., 999]

现在我想从这个列表中选择每个第 n 个元素。 假设 n 是有理数。这里:n = 7/3 = 2.333...

因此,新列表的大小应该是原始列表的 42.85% (1/n) 左右。 但我不希望随机选择元素。所选元素之间的间距应该相似,但不必总是完全相同。

结果可能会因您使用的算法而异,只要满足要求,算法就由您决定。但是为了回答评论,这里是一个结果可能看起来像的例子:

int_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
out_list = [0, 2, 4, 8, 10]

out_list 的大小是int_list 的 45.4545...%,不是 42.85%,但它是它所能得到的最接近的。

【问题讨论】:

  • 该示例的预期结果是什么?
  • 整数之间怎么会有非整数的差距?
  • 我举了一个例子,@superb rain
  • 缺少 6,所以不是每隔一个元素。
  • 啊,错过了。可能比更多类似的差距更难生产。仍然......为什么要再举一个例子,而不是仅仅回答完美的第一个?

标签: python logic


【解决方案1】:

用分母缩放范围,用分子步进,并通过除以分母缩小:

>>> [i // 3 for i in range(0, 3 * 1000, 7)]
[0, 2, 4, 7, 9, 11, 14, 16, 18, 21, 23, 25, 28, 30, 32, 35, ..., 991, 994, 996, 998]

您的示例是一个范围,而不是一个列表。如果您确实有一个列表,那么只需使用我的数字作为索引,即,而不是 i // 3a[i // 3]

【讨论】:

    【解决方案2】:

    一种相当通用的方法,其中列表不必包含 int 范围,并且有理值甚至可以小于 1:

    N = 7
    D = 3
    
    k = 0
    result = []
    for i in int_list:
        k += D
        while k >= N:
            result.append(i)
            k -= N
    

    【讨论】:

      【解决方案3】:

      天真的想法是

      from math import floor
      
      def every_n(lst: list, n: int) -> list:
          l = [] 
          i = 0 
          while i < len(lst): 
              l.append(lst[floor(i)]) 
              i += n 
          return l
      
      >>> every_n(range(1000), 7/3)
      [0, 2, 4, 7, 9, 11, 14, 16, 18, 21, 23, 25, 28, 30, 32, 35, ..., 991, 994, 996, 998]
      

      【讨论】:

        猜你喜欢
        • 2018-03-11
        • 2022-01-25
        • 1970-01-01
        • 2021-10-03
        • 1970-01-01
        • 1970-01-01
        • 2018-10-07
        • 2020-01-10
        • 1970-01-01
        相关资源
        最近更新 更多