【问题标题】:Increment variable within for loopfor循环中的增量变量
【发布时间】:2017-03-22 14:51:13
【问题描述】:

我是 Python 新手,正在尝试找出如何解决以下问题。我有两个列表,list1 看起来像这样:

['10','12','12','23]

list2 看起来像这样:

['15','16','13','15']

我还有一个包含以下键值的字典:

dictionary = {
'10': 'AATGCGTAAGCTAGCGATAGATGCAACGTT', 
'12': 'GGTCAGAGTTTATCGGTATGTTAGCATGGA', 
'23': 'ATGGGCGCGTATATTAAAGGCGCCGCCCTG'
}

此字典中的键由 list1 中的元素组成。 list1 中的每个元素也与 list2 中的单个元素相关联(按顺序,list1 中的“10”与 list2 中的“15”相关联,list1 中的“12”与 list2 中的“16”相关联,等等)。

对于 list1 中的每个元素,我想取关联的字典值,并使用 list2 中的关联元素将字符插入特定位置以确定位置。到目前为止,我一直在研究一个 for 循环来做到这一点:

for i in list1:
    dict_key = dictionary.get(i)
    pos = int(list2[0])
    full = dict_key[:pos] + '[' + dict_key[pos] + ']' +  dict_key[(pos+1):]
    print(full)

我希望我的最终输出如下所示:

AATGCGTAAGCTAGC[G]ATAGATGCAACGTT
GGTCAGAGTTTATCGG[T]ATGTTAGCATGGA
GGTCAGAGTTTAT[C]GGTATGTTAGCATGGA
ATGGGCGCGTATATT[A]AAGGCGCCGCCCTG

但我的输出目前看起来像这样,因为我专门要求 list2 中的索引 0:

AATGCGTAAGCTAGC[G]ATAGATGCAACGTT
GGTCAGAGTTTATCG[G]TATGTTAGCATGGA
GGTCAGAGTTTATCG[G]TATGTTAGCATGGA
ATGGGCGCGTATATT[A]AAGGCGCCGCCCTG

我想在循环的每次迭代中将 list2 中调用的元素增加 1,但我似乎无法弄清楚。我应该使用范围定义一个新变量吗?任何 cmets 将不胜感激!

【问题讨论】:

    标签: python loops iteration increment


    【解决方案1】:

    在这种情况下使用enumerate 很有帮助——它为您提供了一个包含每个元素的位置以及元素本身的元组。请注意,我已将 i 的含义更改为表示元素的位置而不是元素。

    您的变量dict_key 可能更适合称为dict_value,因为list1 中的元素实际上是您在dictionary 中查找的键。

    for i, el in enumerate(list1):
        dict_value = dictionary.get(el)
        pos = int(list2[i])
        full = dict_value[:pos] + '[' + dict_value[pos] + ']' +  dict_value[(pos+1):]
        print(full)
    

    【讨论】:

    • 也很有帮助,感谢@enigma,我以前没有使用过枚举。
    【解决方案2】:

    只需将for i in list1: 更改为for i, pos in zip(list1, list2): 并删除循环第二行中pos 的分配。 zip 将让您同时遍历两个列表。

    【讨论】:

    • 感谢@Randy C 的解决方案!非常简单,做我想做的事,一般来说也会有帮助。再次感谢!
    【解决方案3】:

    您可以为您的列表构建迭代器(例如int(i) for i in list2 迭代list2,在途中将其值转换为int)并使用zip 成对读取它们。

    list1 = ['10','12','12','23']
    list2 = ['15','16','13','15']
    
    dictionary = {
    '10': 'AATGCGTAAGCTAGCGATAGATGCAACGTT', 
    '12': 'GGTCAGAGTTTATCGGTATGTTAGCATGGA', 
    '23': 'ATGGGCGCGTATATTAAAGGCGCCGCCCTG'
    }
    
    for val, pos in zip((dictionary[j] for j in list1), (int(i) for i in list2)):
        full = val[:pos] + '[' + val[pos] + ']' +  val[(pos+1):]
        print(full)
    

    有些人更喜欢字符串格式化来构建结果字符串

    full = '{}[{}]{}'.format(val[:pos], val[pos], val[pos+1:]) 
    

    但这是个人喜好。

    【讨论】:

    • 谢谢@tdelaney,给了我我想要的东西,我现在知道了列表迭代器。
    猜你喜欢
    • 2018-12-25
    • 1970-01-01
    • 2021-02-16
    • 2013-11-25
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2019-06-25
    相关资源
    最近更新 更多