通过元组字典解析
Parsing through a dictionary of tuples
通过使用迭代和理解,我创建了一个 python 字典来存储与值关联的键(与某些功能相关的统计信息)。键指的是一个唯一的 ID(在我的例子中是一个基因)。我通过元组列表填充了值,每个元组指示特征的 startpoint 和 length(在本例中, ORF 或换句话说 基因 ID 的潜在蛋白质编码序列 )。任何给定的基因都可以具有许多这样的特征。一般形式如下:
{key1:[(startpoint1,length1)], key2[(startpoint1,length1)(startpoint2,length2)...], key3[]}
如下所示(在示例字典中),一些键可能只有一个特征(只有一对元组),而其他键可能有多达 100 个或更多。为简单起见,我用 3 对显示了 seq1。也可以有没有特征的键,例如seq3和4。
{'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []}
我想遍历此字典以在 "length" 最大时获取 "startpoint"。在我的示例中,我应该得到的答案是
startpoint 1 (in seq1), because it has biggest length value (12) among all the entries.
我发现很难遍历多个元组。
这段代码应该可以。
myDict = {'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []}
maxLength = 0;
maxStartingPoint = 0;
maxSeq = ""
for sequence in myDict:
for key,value in myDict[sequence]:
if value > maxLength:
maxLength = value
maxStartingPoint = key
maxSeq = sequence
您还可以使用 itertools.chain.from_iterable
,将 dict.values()
(字典中所有值的列表)传递给它。然后将 max
与 key 参数一起使用,以在第二个索引( 1-index )处取回具有最大值的元组,示例 -
>>> from itertools import chain
>>> d = {'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []}
>>> max(chain.from_iterable(d.values()),key=lambda x: x[1])
(1, 12)
itertools.chain.from_iterable
,将其获取的可迭代对象作为输入并将每个链接到一个列表中,示例 -
>>> l = [(1,2),(3,4)]
>>> list(chain.from_iterable(l))
[1, 2, 3, 4]
这是我的方法:创建一个元组列表 (length, start_point, key)
,这样,max
函数可以只选择最大长度的元组。
def maxlen(seq):
longest = max((length, start_point, key) for key, value in seq.iteritems() for start_point, length in value)
return longest
# Test
seq = {'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []}
length, start_point, key = maxlen(seq) # 12, 1, 'seq1'
通过使用迭代和理解,我创建了一个 python 字典来存储与值关联的键(与某些功能相关的统计信息)。键指的是一个唯一的 ID(在我的例子中是一个基因)。我通过元组列表填充了值,每个元组指示特征的 startpoint 和 length(在本例中, ORF 或换句话说 基因 ID 的潜在蛋白质编码序列 )。任何给定的基因都可以具有许多这样的特征。一般形式如下:
{key1:[(startpoint1,length1)], key2[(startpoint1,length1)(startpoint2,length2)...], key3[]}
如下所示(在示例字典中),一些键可能只有一个特征(只有一对元组),而其他键可能有多达 100 个或更多。为简单起见,我用 3 对显示了 seq1。也可以有没有特征的键,例如seq3和4。
{'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []}
我想遍历此字典以在 "length" 最大时获取 "startpoint"。在我的示例中,我应该得到的答案是
startpoint 1 (in seq1), because it has biggest length value (12) among all the entries.
我发现很难遍历多个元组。
这段代码应该可以。
myDict = {'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []}
maxLength = 0;
maxStartingPoint = 0;
maxSeq = ""
for sequence in myDict:
for key,value in myDict[sequence]:
if value > maxLength:
maxLength = value
maxStartingPoint = key
maxSeq = sequence
您还可以使用 itertools.chain.from_iterable
,将 dict.values()
(字典中所有值的列表)传递给它。然后将 max
与 key 参数一起使用,以在第二个索引( 1-index )处取回具有最大值的元组,示例 -
>>> from itertools import chain
>>> d = {'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []}
>>> max(chain.from_iterable(d.values()),key=lambda x: x[1])
(1, 12)
itertools.chain.from_iterable
,将其获取的可迭代对象作为输入并将每个链接到一个列表中,示例 -
>>> l = [(1,2),(3,4)]
>>> list(chain.from_iterable(l))
[1, 2, 3, 4]
这是我的方法:创建一个元组列表 (length, start_point, key)
,这样,max
函数可以只选择最大长度的元组。
def maxlen(seq):
longest = max((length, start_point, key) for key, value in seq.iteritems() for start_point, length in value)
return longest
# Test
seq = {'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []}
length, start_point, key = maxlen(seq) # 12, 1, 'seq1'