【问题标题】:Python 2.7 creating a matrix from listsPython 2.7 从列表创建矩阵
【发布时间】:2016-05-27 17:19:47
【问题描述】:

我有两个列表:

a_list 包含不同的元组 ID:

a_list = [('1'), ('2'), ('3'), ('4')...etc]

元组列表中的列表称为check_list

check_list = [[[('1'), ('2')]], [[('2'), ('3')], [('3'),('4')]], [[('1'),('3')]]...etc]

我遇到了一个对于我的 python 技能水平来说有点过于复杂的问题...我正在尝试形成一个矩阵以输出到 csv 文件,其结构如下:

     1 2 3 4 

1 1 1 0 0

2 0 1 2 1

3 1 0 1 0

其中每个值都是a_listcheck_list 中的数字的计数。

我看过 numpy,但我一无所知。我玩过this,但我似乎无法完全理解将其转移到我的问题上。我对数组知识也很有限。提前致谢。

【问题讨论】:

  • 您的子列表中是否真的有元组,因为发布的括号没有做任何事情?
  • 你想告诉我们任何关于字符串的括号吗?这些实际上应该是元组吗?有什么问题,计数还是写入文件?
  • 是的,括号应该是元组并且应该在那里。问题在于计数。
  • 然后编辑您的问题。就目前而言,a_list 只是一个字符串列表,因为('1') == '1'

标签: python arrays python-2.7 numpy matrix


【解决方案1】:

您可以使用 Counter dict 获取计数,使用 OrderedDict 按键排序以获取 Order 中的计数以维护该顺序,并使用 dict.viewkeys 查找缺少的键。

from __future__ import print_function
from collections import Counter, OrderedDict
from itertools import chain

check_list = [[[('1',), ('2',)]], [[('2',), ('3',)], [('3',), ('4',)]], [[('1',), ('3',)]]]

a_list = [('1',), ('2',), ('3',), ('4',)]

cn = OrderedDict(sorted(Counter(a_list).items()))

print(" ".join([str(t[0]) for t in cn]))
for chk in check_list:
    _cn = Counter(chain(*chk))
    # cn.keys() python 3
    diff = cn.viewkeys() - _cn
    for k  in cn:
        if k not in diff:
            print(_cn[k], end=" ")
        else:
            print(0, end=" ")
    print()

输出:

1 2 3 4
1 1 0 0 
0 1 2 1 
1 0 1 0 

如果您不关心顺序,您可以删除 sorted/Ordereddict 逻辑:

from collections import Counter
from itertools import chain

check_list = [[[('1',), ('2',)]], [[('2',), ('3',)], [('3',), ('4',)]], [[('1',), ('3',)]]]

a_list = [('1',), ('2',), ('3',), ('4',)]

cn = Counter(a_list)

print(" ".join([str(t[0]) for t in cn]))
for chk in check_list:
    _cn = Counter(chain(*chk))
    diff = cn.viewkeys() - _cn
    for k  in cn:
        if k not in diff:
            print(_cn[k], end=" ")
        else:
            print(0, end=" ")
    print()

这会给你一个任意的顺序:

3 4 1 2
0 0 1 1 
2 1 0 1 
1 0 1 0 

要写入 csv:

from collections import Counter, OrderedDict
from itertools import chain
from csv import writer

check_list = [[[('1',), ('2',)]], [[('2',), ('3',)], [('3',), ('4',)]], [[('1',), ('3',)]]]

a_list = [('1',), ('2',), ('3',), ('4',)]

with open("out.csv","w") as out:
    wr = writer(out,delimiter=" ")
    cn = OrderedDict(sorted(Counter(a_list).items()))
    wr.writerow(list(chain(*cn)))
    for chk in check_list:
        _cn = Counter(chain(*chk))
        diff = cn.viewkeys() - _cn
        wr.writerow([_cn[k] if k not in diff else 0 for k in cn])

out.csv:

1 2 3 4
1 1 0 0
0 1 2 1
1 0 1 0

【讨论】:

  • 完美!我也明白!
猜你喜欢
  • 1970-01-01
  • 2016-07-29
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多