检查列表中的元素是否在定义的位置具有值

Check if an element in a list has a value in a defined position

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

["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)。所以我需要 select: '0001', '1000', '1001', '0000' 其中在位置 1 中包含 0,在位置 2 中包含 0。我想对所有这些值求和。 '1101'不好,因为按顺序包含,位置0为1,位置1为0,位置2为1,位置3为1.

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

我希望我说清楚了

我假设你的索引是字典。我正在根据索引在这里创建一个新的。我的代码看起来像下面这样,利用 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

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

要解决此问题,您可以使用切片表示法,它可以让您从右侧开始索引,以及列表理解。

从右边开始索引是这样的:

输入:

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'。

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

希望对您有所帮助!

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

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(您要查找的结果)?

编辑:根据评论

的输入进行了更改