Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 嵌套字典中的匹配值_Python_Python 3.x_Dictionary_List Comprehension - Fatal编程技术网

Python 嵌套字典中的匹配值

Python 嵌套字典中的匹配值,python,python-3.x,dictionary,list-comprehension,Python,Python 3.x,Dictionary,List Comprehension,我有两个包含嵌套子字典的字典。它们的结构如下: search_regions = { 'chr11:56694718-71838208': {'Chr': 'chr11', 'End': 71838208, 'Start': 56694718}, 'chr13:27185654-39682032': {'Chr': 'chr13', 'End': 39682032, 'Start': 27185654} } database_variants = { 'chr11:56

我有两个包含嵌套子字典的字典。它们的结构如下:

search_regions = {
    'chr11:56694718-71838208': {'Chr': 'chr11', 'End': 71838208, 'Start': 56694718},
    'chr13:27185654-39682032': {'Chr': 'chr13', 'End': 39682032, 'Start': 27185654}
}

database_variants = {
    'chr11:56694718-56694718': {'Chr': 'chr11', 'End': 56694718, 'Start': 56694718},
    'chr13:27185659-27185659': {'Chr': 'chr13', 'End': 27185659, 'Start': 27185659}
}
def region_to_variant_location_match(search_Regions, database_Variants):
    '''Take dictionaries for search_Variants and database_Variants as 
    input.                                         
    Match variants in database_Variants to regions within search_Variants.'''
    for key, values in database_Variants.items():
        for value in values:
            for search_area in search_Regions[key]:
                print(search_area)
                if (value >= search_area[0]) and (value <= search_area[1]):
                    yield(key, search_area)
我需要比较它们,然后从数据库中取出字典 属于搜索区域的词典范围

我正在构建一个函数来实现这一点()。这就是我到目前为止所做的:

def region_to_variant_location_match(search_Variants, database_Variants):
    '''Take dictionaries for search_Variants and database_Variants as input.
    Match variants in database_Variants to regions within search_Variants.
    Return matches as a nested dictionary.'''
    #Match on Chr value
        #Where Start value from database_variant is between St and End values in 
        search_variants.
    #return as nested dictionary
我遇到的问题是如何找到嵌套字典(Chr、St、End等)中的值进行比较。我想使用列表理解来实现这一点,因为我有很多数据要处理,所以更简单的for循环可能更耗时

非常感谢您的帮助

更新

我试图实现下面bioinfoboy建议的解决方案。我的第一步是使用以下函数将搜索区域和数据库变体字典转换为defaultdict(列表):

def search_region_converter(searchDict):
    '''This function takes the dictionary of dictionaries and converts it to a
    DefaultDict(list) to allow matching   
    with the database in a corresponding format'''
    search_regions = defaultdict(list)
    for i in search_regions.keys():
        chromosome = i.split(":")[0]
        start = int(i.split(":")[1].split("-")[0])
        end = int(i.split(":")[1].split("-")[1])
        search_regions[chromosome].append((start, end))
    return search_regions #a list with chromosomes as keys 

def database_snps_converter(databaseDict):
    '''This function takes the dictionary of dictionaries and converts it to a
    DefaultDict(list) to allow matching   
    with the serach_snps in a corresponding format'''
    database_variants = defaultdict(list)
    for i in database_variants.keys():
        chromosome = i.split(":")[0]
        start = int(i.split(":")[1].split("-")[0])
        database_variants[chromosome].append(start)
    return database_variants #list of database variants 
然后,我制作了一个匹配函数(同样使用bioinfoboy的代码),如下所示:

search_regions = {
    'chr11:56694718-71838208': {'Chr': 'chr11', 'End': 71838208, 'Start': 56694718},
    'chr13:27185654-39682032': {'Chr': 'chr13', 'End': 39682032, 'Start': 27185654}
}

database_variants = {
    'chr11:56694718-56694718': {'Chr': 'chr11', 'End': 56694718, 'Start': 56694718},
    'chr13:27185659-27185659': {'Chr': 'chr13', 'End': 27185659, 'Start': 27185659}
}
def region_to_variant_location_match(search_Regions, database_Variants):
    '''Take dictionaries for search_Variants and database_Variants as 
    input.                                         
    Match variants in database_Variants to regions within search_Variants.'''
    for key, values in database_Variants.items():
        for value in values:
            for search_area in search_Regions[key]:
                print(search_area)
                if (value >= search_area[0]) and (value <= search_area[1]):
                    yield(key, search_area)
def区域到变量位置匹配(搜索区域、数据库变量):
''将搜索变量和数据库变量的字典作为
输入。
将数据库_变体中的变体与搜索_变体中的区域匹配。“”
对于键,数据库_Variants.items()中的值:
对于值中的值:
对于搜索区域[键]中的搜索区域:
打印(搜索区域)

如果(value>=search_area[0])和(value,您可能应该执行以下操作

def region_to_variant_location_match(search_Variants, database_Variants):
    '''Take dictionaries for search_Variants and database_Variants as input.
    Match variants in database_Variants to regions within search_Variants.
    Return matches as a nested dictionary.'''
    return {
        record[0]: record[1]
        for record, lookup in zip(
            database_Variants.items(),
            search_Variants.items()
        )
        if (
            record[1]['Chr'] == lookup[1]['Chr'] and 
            lookup[1]['Start'] <= record[1]['Start'] <= lookup[1]['End']
        )
    }
def区域到变量位置匹配(搜索变量、数据库变量):
''将搜索变量和数据库变量的字典作为输入。
将数据库_变体中的变体与搜索_变体中的区域匹配。
将匹配项作为嵌套字典返回。“”
返回{
记录[0]:记录[1]
请记录在zip中查找(
数据库_Variants.items(),
搜索变量。项()
)
如果(
记录[1]['Chr']==查找[1]['Chr']和

查找[1]['Start']我想这可能会有所帮助

我正在根据我在评论中提到的内容转换您的
搜索区域
数据库变量

从集合导入defaultdict
_数据库变量=defaultdict(列表)
_搜索区域=默认目录(列表)
对于数据库中的i_variants.keys():
_染色体=分裂(“:”[0]
_start=int(i.split(“:”[1]。split(“-”[0]”)
_数据库\u变体[\u染色体]。追加(\u开始)
_搜索区域=默认目录(列表)
对于搜索区域中的i。键():
_染色体=分裂(“:”[0]
_start=int(i.split(“:”[1]。split(“-”[0]”)
_end=int(i.split(“:”[1]。split(“-”[1]”)
_搜索区域[\u染色体]。追加(\u开始,\u结束))
定义搜索(数据库变量、搜索区域):
对于键,_database_variants.items()中的值:
对于值中的值:
对于搜索区域中的搜索区域[键]:

如果(值>=搜索区域[0]),并且(不需要打开另一个值,您的问题是,您已将数据格式从具有特定格式的
dicts的
列表更改为具有不同格式的
dict
,您无法更改模式,除了要工作的代码。您的函数代码从
区域更改为变量位置atch很难阅读,似乎是无效的Python语法。重新格式化它,使其成为有效的Python代码,并可能尝试使其符合。它需要几个小时的阅读和重构,但肯定会很快得到回报。@KobiK更详细地研究了这个问题后,我意识到我需要将输入作为嵌套dicts、 而不是听写列表。我认为打开一个新问题比改变现有问题的起点更合适。我将编辑以改进逻辑。@JanVlcinsky谢谢Jan,这会使它更好!我将确保从现在开始使用它。我将稍微编辑这个问题,这可能会删除一些非常有用的内容建议,让您知道我很感激。:)我想您可以签出
defaultdict
并修改您的
搜索区域
,这样键就是染色体(例如
chr11
)。之后,您可以将开始和结束作为元组/列表列表。我遇到过类似的情况,我所能想到的就是更改染色体的键。这可能不是最佳且最省时的选择。谢谢,不幸的是,它不适合我(我意识到我可能必须调整它).我从'for'子句中得到'ValueError:需要两个以上的值才能解包'。有什么想法吗?@s_boardman:编辑以纠正您注意到的问题--元组没有正确地
chain
ing。显然,我所做的快速示例过于抽象化,无法完成所需的操作,
itertools.chain
的行为不符合预期。这是有希望的y仍然相当清晰,更接近预期行为。谢谢,我已尝试根据您的建议更新代码,但没有任何乐趣。有关更多详细信息,请参阅问题更新。:)已经更新了答案;让我知道它是否适用于您。如果可以,我可以问一个具体的问题吗?生物信息学方面,您试图实现什么?您是否试图找出您的读取/读取集群是否在GTF记录内?