【问题标题】:Detecting items in the same position of different lists检测不同列表相同位置的项目
【发布时间】:2019-11-10 02:32:05
【问题描述】:

我有一个 csv 文件,其中包含多行和每行中的多个条目。我知道如何将 csv 的每一行转换为列表。

例如从到

  1,x,2                       [1,x,2]
  3,x,4                       [3,x,4]
  5,y,6                       [5,y,6]
  7,y,8                       [7,y,8]

但我不知道如何通过每个列表找到位于同一位置但在不同列表中的项目。我希望能够检测到“x”和“y”(以及后续列表中相同位置的任何其他项目)。

此外,一旦我可以检测并区分 x、y 等...,然后我想整理和分析另一项匹配列表。

例如

[1,x,2] [3,x,4]

整理 2 和 4,因为它们的列表有 x。

[5,y,6] [7,y,8]

整理 6 和 8,因为它们的列表有 y。

【问题讨论】:

    标签: python list python-3.7


    【解决方案1】:

    构建共享某个属性的所有项目的集合的一种简单方法是将它们放入以该属性为关键字的字典中。

    from collections import defaultdict
    from typing import List, Dict, Tuple, Union
    
    Entry = Union[int, str]
    csv: List[List[Entry]] = [
        [1,'x',2],
        [3,'x',4],
        [5,'y',6],
        [7,'y',8]
    ]
    
    index: Dict[Tuple[int, Entry], List[List[Entry]]] = defaultdict(list)
    
    for row in csv:
        for i in range(len(row)):
            # Key on a tuple of i and the entry, e.g. (1, 'x') 
            index[(i, row[i])].append(row)
    
    for key in index:
        if len(index[key]) > 1:
            print("index %d contains entry %s in multiple lists:" % key)
            print(index[key])
    

    产生以下输出:

    index 1 contains entry x in multiple lists:
    [[1, 'x', 2], [3, 'x', 4]]
    index 1 contains entry y in multiple lists:
    [[5, 'y', 6], [7, 'y', 8]]
    

    【讨论】:

    • 非常感谢您的解决方案。我在适应它时遇到了一些麻烦。我的“x”、“y”等是单词,而不是数字。而且我相信您的解决方案要求它们是整数。您对我如何将其用于文本/字符串有什么建议吗?
    • 我的解决方案特别允许它们是字符串——'x''y' 都是字符串文字,我将 Entry 定义为 intstr(这就是Union 类型表示)。
    • 代码中也没有任何内容需要Entry 具有特定类型;您可以将其替换为 Any,其他一切都将完全一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多