【问题标题】:Splitting lists of lists into two lists of lists, based on duplicates in one of the original list of lists根据原始列表之一中的重复项,将列表列表拆分为两个列表列表
【发布时间】:2021-04-26 20:39:51
【问题描述】:

我有两个列表

queryBounds = [[2, 1924], [2, 1924], [2187, 2233], [2187, 2233]]
sequenceBounds = [[95516, 97442], [139777, 137851], [97433, 97479], [137860, 137814]]

我想将 queryBounds 拆分为两个列表 queryBoundsAqueryBoundsB 以便在两个列表中都没有重复,即

queryBoundsA = [[2, 1924], [2187, 2233]]
queryBoundsB = [[2, 1924], [2187, 2233]]

然后我想将sequenceBounds 拆分为两个列表sequenceBoundsAsequenceBoundsB,以便sequenceBounds 中与queryBounds 具有相同索引的项目移动到queryBoundsAqueryBoundsB ,并且它们的列表索引与来自sequenceBounds 的具有相同索引的项目的位置匹配。

sequenceBoundsA = [[95516, 97442], [97433, 97479]]
sequenceBoundsB = [[139777, 137851], [137860, 137814]]

queryBounds 仅包含重复项时,我也需要此功能:

queryBounds = [[2, 2233], [2, 2233]]
sequenceBounds = [[111722, 113939], [166447, 164230]]

queryBoundsA = [[2, 2233]]
queryBoundsB = [[2, 2233]]

sequenceBoundsA = [[111722, 113939]]
sequenceBoundsB = [[166447, 164230]]

我不知道该怎么做

【问题讨论】:

  • 问题:如果 queryBounds 列表中有 三个 项出现应该怎么办?还是这种情况不太可能发生?
  • 在什么基础上分离 queryBoundsA 和 queryBoundsB,更大的测试数据会更容易理解
  • 请从intro tour 重复on topichow to ask。 “告诉我如何解决这个编码问题”不是堆栈溢出问题。我们希望您做出诚实的尝试,然后然后就您的算法或技术提出一个具体的问题。 Stack Overflow 无意取代现有的文档和教程。
  • Stack Overflow 不是编码服务,我们一般不处理代码设计。如果您需要帮助,请将您的示例扩展为完整的规范并发布您的问题代码。 (见minimal, reproducible example (MRE))。
  • 最好的策略很可能取决于你想用这些对做什么。我可以想象,当您可以遍历压缩列表并随时检查重复项时,拆分列表可能会浪费时间。

标签: python list


【解决方案1】:

让字典来完成这项艰巨的工作。这将处理超过 2 个副本:

queryBounds = [[2, 1924], [2, 1924], [2187, 2233], [2187, 2233]]
sequenceBounds = [[95516, 97442], [139777, 137851], [97433, 97479], [137860, 137814]]

# Create a dict:

sorter = {}
for q, s in zip(queryBounds,sequenceBounds):
    q = tuple(q)
    if q not in sorter:
        sorter[q] = [s]
    else:
        sorter[q].append( s )

# Print the results:
qb = [[]]
sb = [[]]
for k, v in sorter.items():
    for i,v1 in enumerate(v):
        if i >= len(qb):
            qb.append( [] )
            sb.append( [] )
        qb[i].append( list(k) )
        sb[i].append( v1 )

print( qb )
print( sb )

输出:

[[[2, 1924], [2187, 2233]], [[2, 1924], [2187, 2233]]]
[[[95516, 97442], [97433, 97479]], [[139777, 137851], [137860, 137814]]]

【讨论】:

    【解决方案2】:

    您可以将enumerateitertools.groupby 一起使用:

    from itertools import groupby as gb
    def split_bounds(query, seq):
       r = list(zip(*[list(b) for _, b in gb(enumerate(query), key=lambda x:x[-1])]))
       query_r = [[b for _, b in i] for i in r]
       seq_r = [[seq[a] for a, _ in i] for i in r]
       return query_r, seq_r
    

    queryBounds1 = [[2, 1924], [2, 1924], [2187, 2233], [2187, 2233]]
    sequenceBounds1 = [[95516, 97442], [139777, 137851], [97433, 97479], [137860, 137814]]
    queryBounds2 = [[2, 2233], [2, 2233]]
    sequenceBounds2 = [[111722, 113939], [166447, 164230]]
    query1, seq1 = split_bounds(queryBounds1, sequenceBounds1)
    query2, seq2 = split_bounds(queryBounds2, sequenceBounds2)
    

    输出:

    [[[2, 1924], [2187, 2233]], [[2, 1924], [2187, 2233]]]
    [[[95516, 97442], [97433, 97479]], [[139777, 137851], [137860, 137814]]]
    [[[2, 2233]], [[2, 2233]]]
    [[[111722, 113939]], [[166447, 164230]]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 2015-12-13
      • 2021-05-23
      • 1970-01-01
      • 2011-01-05
      相关资源
      最近更新 更多