【问题标题】:align arrays with python用python对齐数组
【发布时间】:2016-08-05 04:43:05
【问题描述】:

我有 3 个文件(file1.txtfile2.txtfile3.txt)看起来像:

文件1:

-7  12
-6  13
-5  11
-4  10
-3  4
-2  8
-1  7
0   9
1   10

文件2:

-5  13
-4  4
-3  5
-2  4
-1  7
0   6
1   9
2   10
3   2

文件3:

-2  3
-1  14
0   8
1   7
2   3
3   9
4   10
5   8
6   3

我想对齐我从这些文件中读取的数组的零点,并获得右侧值的总和,即得到如下内容:

-7  ->  12  + 0  + 0  =  12
-6  ->  13  + 0  + 0  =  13
-5  ->  11  + 13 + 0  =  24
-4  ->  10  + 4  + 0  =  14
-3  ->  4   + 5  + 0  =  9
-2  ->  8   + 4  + 3  =  15
-1  ->  7   + 7  + 14 =  28
0   ->  9   + 6  + 8  =  23
1   ->  10  + 9  + 7  =  26
2   ->  0   + 10 + 3  =  13
3   ->  0   + 2  + 9  =  11
4   ->  0   + 0  + 10 =  10
5   ->  0   + 0  + 8  =  8
6   ->  0   + 0  + 3  =  3
7   ->  0   + 0  + 0  =  0

我怎么能用 Python 做到这一点?提前谢谢你。

【问题讨论】:

  • 你尝试过什么吗?
  • 我有点惭愧,但我没有任何想法......
  • 你知道如何从文件中读取值吗?还是你被困在上面了?
  • 您可以将每个文件读入字典,其中键 = 第一列,值 = 第二列。这应该让你开始..

标签: python arrays alignment


【解决方案1】:

只是一个想法,但会有很多:

  1. 将所有这些对导入到一个对列表中
  2. 创建第二个空对列表
  3. 解析第一个列表的每一对并检查该对的第一个元素是否在第二个列表的对的第一个元素中的某个位置。如果它已经是对的第二个元素求和,否则只需将该对附加到第二个列表中。

【讨论】:

    【解决方案2】:

    从开始到结束,假设预期的输出是 csv,并且输入文件是通过“,”分隔的 csv。输出方法非常灵活,但如果有其他预期。

    import petl
    
    file1 = petl.fromcsv('file1.csv')
    file1 = petl.pushheader(file1, ['position', 'value1'])
    file2 = petl.fromcsv('file2.csv')
    file2 = petl.pushheader(file2, ['position', 'value2'])
    file3 = petl.fromcsv('file3.csv')
    file3 = petl.pushheader(file3, ['position', 'value3'])
    
    
    file1_joined_file2 = petl.outerjoin(file1, file2, key='position')
    all_joined = petl.outerjoin(file1_joined_file2, file3, key='position')
    all_joined = petl.convert(all_joined, 'value1', {None: 0})
    all_joined = petl.convert(all_joined, 'value2', {None: 0})
    all_joined = petl.convert(all_joined, 'value3', {None: 0})
    all_joined = petl.convert(all_joined, ('position', 'value1', 'value2', 'value3'), int)
    all_joined = petl.addfield(all_joined, 'sum', lambda rec: rec['value1'] + rec['value2'] + rec['value3'])
    all_joined = petl.sort(all_joined, 'position')
    
    print petl.lookall(all_joined)
    petl.tocsv(all_joined, 'done.csv')
    

    上面打印的输出:

    +----------+--------+--------+--------+-----+
    | position | value1 | value2 | value3 | sum |
    +==========+========+========+========+=====+
    |       -7 |     12 |      0 |      0 |  12 |
    +----------+--------+--------+--------+-----+
    |       -6 |     13 |      0 |      0 |  13 |
    +----------+--------+--------+--------+-----+
    |       -5 |     11 |     13 |      0 |  24 |
    +----------+--------+--------+--------+-----+
    |       -4 |     10 |      4 |      0 |  14 |
    +----------+--------+--------+--------+-----+
    |       -3 |      4 |      5 |      0 |   9 |
    +----------+--------+--------+--------+-----+
    |       -2 |      8 |      4 |      3 |  15 |
    +----------+--------+--------+--------+-----+
    |       -1 |      7 |      7 |     14 |  28 |
    +----------+--------+--------+--------+-----+
    |        0 |      9 |      6 |      8 |  23 |
    +----------+--------+--------+--------+-----+
    |        1 |     10 |      9 |      7 |  26 |
    +----------+--------+--------+--------+-----+
    |        2 |      0 |     10 |      3 |  13 |
    +----------+--------+--------+--------+-----+
    |        3 |      0 |      2 |      9 |  11 |
    +----------+--------+--------+--------+-----+
    |        4 |      0 |      0 |     10 |  10 |
    +----------+--------+--------+--------+-----+
    |        5 |      0 |      0 |      8 |   8 |
    +----------+--------+--------+--------+-----+
    |        6 |      0 |      0 |      3 |   3 |
    +----------+--------+--------+--------+-----+
    

    【讨论】:

      猜你喜欢
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      相关资源
      最近更新 更多