如何从重复值列表中获取唯一值集

2024-09-19 23:37:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要解析一个大的日志文件(平面文件),它包含两列值(column-a,column-B)。在

两列中的值都是重复的。我需要为A列中的每个唯一值找到一组B列的值。在

这是可以使用unixshell命令完成还是需要编写任何perl或python脚本?有什么方法可以做到这一点?在

示例:

xxxA 2
xxxA 1
xxxB 2
XXXC 3
XXXA 3
xxxD 4

输出:

^{pr2}$

Tags: 文件方法命令脚本示例columnperl平面
3条回答

我将使用Python字典,其中字典键是列A值,字典值是Python内置的Set type保存列B值

def parse_the_file():
    lower = str.lower
    split = str.split
    with open('f.txt') as f:
        d = {}
        lines = f.read().split('\n')
        for A,B in [split(l) for l in lines]:
            try:
                d[lower(A)].add(B)
            except KeyError:
                d[lower(A)] = set(B)

        for a in d:
            print "%s - %s" % (a,",".join(list(d[a])))

if __name__ == "__main__":
    parse_the_file()

使用字典的好处是每列a值都有一个字典键。使用集合的好处是您将拥有一组唯一的列B值。在

效率注释:

  • 使用try-catch比使用if\else语句检查初始情况更有效。在
  • str函数在循环外的求值和赋值比在循环内简单地使用它们更有效。在
  • 根据新A值与整个文件中A值重新出现的比例,可以考虑在try catch语句之前使用a = lower(A)
  • 我使用了一个函数,因为在Python中访问局部变量比访问全局变量更有效
  • 其中一些性能提示来自here

在输入示例上测试上面的代码可以得到:

^{pr2}$

Perl“one liner”有意/扩展,以便所有内容都适合窗口:

$ perl -F -lane '

      $hash{ $F[0] }{ $F[1] }++;
  } END {

      for my $columnA ( keys %hash ) {

          print $columnA, " - ", join( ",", keys %$hash{$columnA} ), "\n";
      }
  '

如果我看到原版海报上有一致的尝试,我会解释的。在

您可以使用这个简单的多重映射:

class MultiMap(object):
    values = {}

    def __getitem__(self, index):
        return self.values[index]
    def __setitem__(self, index, value):
        if not self.values.has_key(index):
            self.values[index] = []
        self.values[index].append(value)
    def __repr__(self):
        return repr(self.values)

看到它的行动:http://codepad.org/xOOrlbnf

相关问题 更多 >