Python 选择两个键之间的键和值

Python 选择两个键之间的键和值,python,dictionary,Python,Dictionary,我有下面的字典 {'first': 1, 'el1': 2, 'el2': 2, 'last': 999} 我想选择指定键(本例中的第一个和最后一个)之间的所有项。我如何才能做到这一点如果您的Python是3.7或更高版本,您可以保证保留顺序。任何旧的密钥都可能以随机散列顺序存储 您可以使用keys()获取dict中的所有键。然后在关键点上循环,在找到起始关键点时开始,在找到结束关键点后中断循环 我最初是作为一个片段写的,但决定将“select”解释为添加到一个新字典中。逻辑是一样的 def

我有下面的字典

{'first': 1, 'el1': 2, 'el2': 2, 'last': 999}

我想选择指定键(本例中的第一个和最后一个)之间的所有项。我如何才能做到这一点

如果您的Python是3.7或更高版本,您可以保证保留顺序。任何旧的密钥都可能以随机散列顺序存储

您可以使用
keys()
获取
dict
中的所有键。然后在关键点上循环,在找到起始关键点时开始,在找到结束关键点后中断循环

我最初是作为一个片段写的,但决定将“select”解释为添加到一个新字典中。逻辑是一样的

def select_between(src_dict, start_key, end_key):
    result, selected = {}, False
    for key, value in src_dict.items():
        if not selected:
            if key != start_key:
                continue
            selected = True
        result[key] = value
        if key == end_key:
            break
    return result
以你为例,

select_between({'first': 1, 'el1': 2, 'el2': 2, 'last': 999},
               'el1', 'last')
我会给你

['el1': 2, 'el2': 2, 'last': 999}
               

--B

一种方法是获取原始字典中的键列表,找到起始键和结束键的索引,并使用字典理解从原始字典构建新字典:

>d={'first':1,'el1':2,'el2':2,'last':999}
>>>keys=列表(d.keys())
>>>i=键索引(“第一个”)
>>>j=键索引(“最后一个”)
>>>结果={k:d[k]用于键[i:j+1]中的k}
>>>结果
{'first':1,'el1':2,'el2':2,'last':999}
>>>i=键索引(“el1”)
>>>j=键索引(“最后一个”)
>>>结果={k:d[k]用于键[i:j+1]中的k}
>>>结果
{'el1':2,'el2':2,'last':999}
您可以尝试:

> dict={'first': 1, 'el1': 2, 'el2': 2, 'last': 999}
> for key,value in dict.items():
>     if (key!="first") &(key!="last"):
>         print (value)

请参见此处:

如果要在适当的位置执行此操作:

d = {'first': 1, 'el1': 2, 'el2': 2, 'last': 999}
d.pop('first')
d.pop('last')
如果要保留初始dict,请执行以下操作:

d = {'first': 1, 'el1': 2, 'el2': 2, 'last': 999}
res = {k: v for (k,v) in d if key not in ['first', 'last']}

可以使用生成器,其中为dict项创建迭代器,以便跳过第一个键之前的项,然后生成第二个键之前的项:

def items_between_keys(d, k1, k2):
    items = iter(d.items())
    for k, _ in items:
        if k == k1:
            break
    for k, v in items:
        if k == k2:
            return
        yield k, v
以便:

d = {'first': 1, 'el1': 2, 'el2': 2, 'last': 999}
for k, v in items_between_keys(d, 'first', 'last'):
    print(k, v)
产出:

el1 2
el2 2
或者,使用标志指示在屈服之前已找到第一个键:

def items_between_keys(d, k1, k2):
    found = False
    for k, v in d.items():
        if k == k1:
            found = True
        elif k == k2:
            return
        elif found:
            yield k, v

这里有一个小的自制版本来实现这一点。我们拿钥匙,
先到后
。然后,我们用这些键创建一个新的列表,并且在原始字典中有这些值

dct = {'first': 1, 'el1': 2, 'el2': 2, 'last': 999}

kys = list(dct.keys())
kys = kys[kys.index('first')+1:kys.index('last')]
newDict = {k:dct[k] for k in kys}
print(newDict)
输出

{'el1': 2, 'el2': 2}

您是将“between”定义为字母顺序,还是将键在字典中的显示顺序?而不是字母顺序您指的是什么顺序?它们打印的顺序(对于Python的最新版本,将是插入顺序)还是值的顺序?这个问题没有明确说明,因此您可能会得到与您实际需要不符的答案。您不应该使用
&
进行布尔比较,关键字
更合适。因此,围绕不等式子条件的括号将是不必要的。我也不确定你是否真的解决了提问者的问题,除了他们的示例数据集。如果在
'first'
之前或
'last'
之后有任何键值对,您也可以打印它们。“在指定的键之间”。大概在“last”之后和“first”之前会有键,我不同意,在Python中,使用单词“between”作为字典键是没有意义的。有人可能会说,较新版本的python将键保持在创建顺序中,OrderDicts也是如此,但我不会使用字典结构并执行“在x和y之间搜索键”,这是错误的结构。除非我们在键之间按字母顺序搜索。因此我的答案是:所有当前支持的CPython版本都保持插入顺序。自去年以来,Python3.5和2.7一直不受支持。