【问题标题】:Choose every nth subset of a list/ columns/ array选择列表/列/数组的每第 n 个子集
【发布时间】:2018-10-07 12:59:24
【问题描述】:

如何从以下元素列表中按索引进行选择,所以索引 1,2,然后是 5,6,然后是 9,10? 数字和文字不相关,顺序相关。背后的基本思想如下:假设您有特征 a、b、c、d,并且对于所有这些特征,您都有均值、标准差、最小值和最大值。如果您只对显示特征 b 和 c 感兴趣,如何显示它们?

column=[]
for i in range(1,4):
    for j in list('abcd'):
        column.append(str(j)+str(i))
 column
['a1', 'b1', 'c1', 'd1', 'a2', 'b2', 'c2', 'd2', 'a3', 'b3', 'c3', 'd3']

如何提取索引 1、2、5、6、9、10 处的值,所以结果是

['b1', 'c1', 'b2', 'c2', 'b3', 'c3']

【问题讨论】:

  • 你能更新一下具体的模式吗?
  • 你想通过索引还是通过匹配来获取它们?
  • 按索引,所以索引 1,2,然后是 5,6,然后是 9,10
  • 查看oeis 的模式,我没有看到太多相关的内容。如果你从 1 开始索引,那么它可能是 x^2 + y^2 + z^2 = 索引的数字,或者如果它来自索引 0,它可能是 2or3 mod 5。这仍然不是很有帮助: /
  • edit将有关索引的信息放入问题中。

标签: python


【解决方案1】:

您可以使用正则表达式查找以您要识别的特征开头的所有列。

def get_columns(arr, sw):
  return re.findall(r'(?:{})\d+'.format('|'.join(sw)), ''.join(arr))

上面的函数接受一个特征列表,以及你想要匹配的列列表。

在行动:

In [6]: y = ['featureA1', 'featureB1', 'featureC1', 'featureA2', 'featureB2', 'featureC2']

In [7]: def get_columns(arr, sw):
   ...:   return re.findall(r'(?:{})\d+'.format('|'.join(sw)), ''.join(arr))

In [8]: get_columns(y, ['featureA'])
Out[8]: ['featureA1', 'featureA2']

【讨论】:

  • 我很想知道是否总是按照数字 1、2、3 的顺序排列是否也需要灵活?我很欣赏您的方法允许更改起始字母。
  • 这将按照它们在字符串中出现的顺序查找列。如果他希望列按编号顺序排列,他可以按每列的编号排序。
  • 不,数字不相关,顺序相关。背后的基本思想如下:假设您有特征 a、b、c、d,并且对于所有这些特征,您都有均值、标准差、最小值和最大值。如果你只对展示特征 b 和 c 感兴趣,如何展示它们?
  • @mile.d 将澄清放在问题中,而不是评论。
  • @mile.d 那么我的第二种方法应该可行,您可以传递“功能”列表,即['a', 'b'],您将获得列表中以a或开头的所有条目b 并以数字结尾。
【解决方案2】:

您可以使用步长为 4 的范围,然后从该索引开始访问两个列表元素。

result = []
for i in range(1, len(column)-1, 4):
    result.append(column[i])
    result.append(column[i+1])

警告:这只会返回每个索引对的两个元素都存在的元素。例如。如果没有 10,它将不会返回元素 9。

【讨论】:

  • 请记住,如果输入的长度为 2 或 6 或 10 等,这将省略一些结果。长度为 3 的输入给出 2 个数字作为输出,但长度为 2 的输入给出0.
  • 是的,这段代码只返回他描述的配对元素。如果没有 10 项,它不会返回第 9 项。
【解决方案3】:

一种方法是使用itertools.compressitertools.cycle。它基本上使用掩码为每个 4 元素块重复选择索引 1 和 2 处的元素。

import itertools as it

print([x for x in it.compress(column, it.cycle([0, 1, 1, 0]))])
# ['b1', 'c1', 'b2', 'c2', 'b3', 'c3']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2016-11-03
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多