【问题标题】:Check if an element in a list has a value in a defined position检查列表中的元素是否在定义的位置有值
【发布时间】:2021-01-24 14:27:02
【问题描述】:

我正在寻找一种方法来自动化该过程,我只在列表值的非常特定位置添加具有某些值的元素。我知道这听起来很复杂,但我试图在这个简单的例子中更好地解释自己: 我有所有这些索引:

["0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"]

我想将它们在 x 位置具有 0 或 1 并且在 y 位置具有 0 或 1 的所有索引相加。在这种情况下,我想将所有计数相加,即它们在索引中的位置 1(从右侧)为 0,在位置 0(从右侧)为 1

"01": counts["0001"] + counts["0101"] + counts["1001"] + counts["1101"]

为了更容易理解,在这种情况下,我将所有计数相加,即它们在索引中的位置 1(从右起)为 1,在索引中的位置 0 为 0。

"10": counts["0010"] + counts["0110"] + counts["1010"] + counts["1110"]

我可以在 Python 中找到自动化来执行此操作吗?

编辑: 我会尝试更具体:

counts = {'0001': 0.0001220703125, '0010': 0.000244140625, '0100': 0.0003662109375, '0101': 0.245849609375, '0110': 0.2486572265625, '0111': 0.000244140625, '1000': 0.0009765625, '1001': 0.2508544921875, '1010': 0.252197265625, '1101': 0.00048828125, '0000': 0.0, '0011': 0.0, '1011': 0.0, '1100': 0.0, '1110': 0.0, '1111': 0.0}

例如,我需要获取它们中间有 00 的所有索引(位置 1 和 2)。所以我需要选择:'0001', '1000', '1001', '0000' 其中包含位置 1 中的 0 和位置 2 中的 0。我想对所有这些值求和。 '1101' 不好,因为依次包含位置 0 中的 1、位置 1 中的 0、位置 2 中的 1 和位置 3 中的 1。

我只知道我想要的值(它们是 2,可以取值 0 或 1)和它们的位置(0 或 1 或 2,或 3)。

希望我清楚

【问题讨论】:

  • sum (k.endswith("01") for k in yourlist)?对于其他条件sum (k[2]=="1" and k[0]=="0" for k in yourlist) - 你对你所拥有的任何条件的真实值求和。真 == 1 所以总和 == 数量

标签: python list indexing sum find


【解决方案1】:

要解决这个问题,您可以使用切片表示法,它可以让您从右侧索引,以及列表推导式。

从右侧索引的工作方式如下:

输入:

my_string = '1001'
my_string[-3:-1]

输出:

'00'

这是因为 [-3:] 从右边第三个位置开始索引,而 [:-1] 索引到但不包括右边的最后一个位置。

接下来,您要对字典中键满足此条件的所有元素求和。您可以通过列表推导来做到这一点:

sum([counts[key] for key in counts.keys() if key[-3:-1] == '00'])
0.251953125

把它分成几个步骤:

[counts[key] for key in counts.keys()]

这将创建一个新列表,其中包含原始列表的所有值。单独使用没有用。

但是通过添加条件:“if key[-3:-1] == '00'”,我们将列表过滤为仅具有右侧第三个和右侧第二个的值,什么您正在调用位置 2 和位置 1,都是 '0'。

因此,新列表仅包含您选择的键中的值,然后我们将这些值相加。

希望这会有所帮助!

【讨论】:

  • 这不是我想要的,快看修改后的问题。
  • 嘿,这对你有用吗?所以请接受答案,如果没有,请告诉我如何提供帮助。谢谢。
【解决方案2】:

我假设您的索引是字典。我正在根据索引在这里创建一个新的。我的代码如下所示,使用filter 函数按索引过滤字典。

testlist = ["0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"]
testdict = {}

to_add_end = "10"

for binary in testlist:
    testdict[binary] = int(binary)

filtered_dict = dict(filter(lambda entry:entry[0][-len(to_add_end):] == to_add_end, testdict.items()))
print(sum(filtered_dict.values()))

我们传递给filter的lambda函数:

lambda entry:entry[0][-len(to_add_end):] == to_add_end

它告诉过滤器只保留第一部分 [-len(to_add_end):] 的最后 n 个字母 [-len(to_add_end):] 的元素,即键匹配我们想要保留的结尾。

【讨论】:

  • 但是,如果我想将它们在位置 1 和 2 中的 10 的所有索引相加呢?从所有索引中,我需要保留 0100、1100、1101、0101(假设 n=4)
  • 然后你把to_add_end的文字倒过来
  • 如果更深入,我通常会建议开始使用二进制文件
【解决方案3】:

您是否正在寻找这样的东西:

counts = {'0001': 0.0001220703125, '0010': 0.000244140625, '0100': 0.0003662109375, '0101': 0.245849609375, '0110': 0.2486572265625, '0111': 0.000244140625, '1000': 0.0009765625, '1001': 0.2508544921875, '1010': 0.252197265625, '1101': 0.00048828125, '0000': 0.0, '0011': 0.0, '1011': 0.0, '1100': 0.0, '1110': 0.0, '1111': 0.0}

def addcts(keystr, x, xv, y, yv):
    if x > len(keystr) or y > len(keystr):
        return False
    if keystr[x] == str(xv) and keystr[y] == str(yv):
        return True
    return False

print(sum([kel[1] for kel in counts.items() if addcts(kel[0], 2, 1, 3, 0)])) # 1 at position 2 and 0 at position 3

哪个结果是0.5010986328125(您正在寻找的结果)?

编辑:根据评论输入进行更改

【讨论】:

  • 不完全是。看看这个countsC1 = { "00": counts["0000"] + counts["0100"] + counts["1000"] + counts["1100"], "01": counts["0001"] + counts["0101"] + counts["1001"] + counts["1101"], "10": counts["0010"] + counts["0110"] + counts["1010"] + counts["1110"], "11": counts["0011"] + counts["0111"] + counts["1011"] + counts["1111"] } 我将这些从维度 4 分离到维度 2。考虑到例如 00 对的位置可能会有所不同,例如,我想将所有维度 4 的索引相加,这些索引在位置 1 和2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2021-12-17
  • 1970-01-01
  • 2011-04-20
相关资源
最近更新 更多