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



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

["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',其中包含0在位置1和0在位置2。我想把所有这些值加起来。'1101'不太好,因为按顺序包含位置0为1,位置1为0,位置2为1,位置3为1。

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

我希望我讲清楚了

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

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

输入:

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

因此,新列表只包含您选择的键的值,然后我们将这些值求和。

希望这对你有帮助!

我假设您的索引是字典。我在这里根据索引创建了一个新的。我的代码如下所示,使用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):]即键与我们想要保留的结尾匹配的元素。

你在找这样的东西吗?

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(你正在寻找的结果)?

编辑:根据注释

的输入修改

最新更新