- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的数据中:
myData='''pos\tidx1\tval1\tidx2\tval2
11\t4\tC\t6\tA
15\t4\tA\t6\tT
23\t4\tT\t6\tT
28\t4\tA\t3\tG
34\t4\tG\t3\tC
41\t4\tC\t4\tT
51\t4\tC\t4\tC'''
我读取了以标题为键的数据,csv.DictReader。
import csv
import itertools
input_file = csv.DictReader(io.StringIO(myData), delimiter = '\t')
# which produces an iterator
''' Now, I want to group this dictionary by idx2, where
idx2 values is the main key and other have values merged into list that have same keys'''
# This groupby method give me
file_blocks = itertools.groupby(input_file, key=lambda x: x['idx2'])
# I can print this as
for index, blocks in file_blocks:
print(index, list(blocks))
6 [{'val2': 'A', 'val1': 'C', 'idx1': '4', 'pos': '11', 'idx2': '6'}, {'val2': 'T', 'val1': 'A', 'idx1': '4', 'pos': '15', 'idx2': '6'}, {'val2': 'T', 'val1': 'T', 'idx1': '4', 'pos': '23', 'idx2': '6'}]
3 [{'val2': 'G', 'val1': 'A', 'idx1': '4', 'pos': '28', 'idx2': '3'}, {'val2': 'C', 'val1': 'G', 'idx1': '4', 'pos': '34', 'idx2': '3'}]
4 [{'val2': 'T', 'val1': 'C', 'idx1': '4', 'pos': '41', 'idx2': '4'}, {'val2': 'C', 'val1': 'C', 'idx1': '4', 'pos': '51', 'idx2': '4'}]
But, since the output is exhausted I can't print, use it more than once to debug it.
所以,问题 #1:如何将其转换为非 iter 类型的数据。
问题 #2:我如何进一步处理这个 groupby 对象以将值合并到一个列表中,该列表在同一组/ block 中具有公共(public)键。
Something like orderedDict, defaultDict where the order of the way the data is read is preserved:
{'6': defaultdict(<class 'list'>, {'pos': [11, 15, 23], 'idx1': [4, 4, 4], 'val1': ['C', 'A', 'T'], 'idx2': [6, 6, 6], 'val2': ['A', 'T', 'T']})}
{'3': .....
{'4': .....
我宁愿在分组之前通过唯一键准备一个键:[值]:
update_dict = {}
for lines in input_file:
print(type(lines))
for k, v in lines:
update_dict['idx2'] = lines[k,v]
我尝试的另一件事是确定我是否可以合并分组对象中的数据: new_groupBy = {} 对于索引,file_blocks 中的 block : 打印(索引,列表( block )) 对于 block 中的 x: 对于 k,v 在 x 中: 为 new_groupBy 做点什么
最佳答案
因此,对于您的第一个问题,您可以简单地具体化一个列表:
In [9]: raw_data='''pos\tidx1\tval1\tidx2\tval2
...: 11\t4\tC\t6\tA
...: 15\t4\tA\t6\tT
...: 23\t4\tT\t6\tT
...: 28\t4\tA\t3\tG
...: 34\t4\tG\t3\tC
...: 41\t4\tC\t4\tT
...: 51\t4\tC\t4\tC'''
In [10]: data_stream = csv.DictReader(io.StringIO(raw_data), delimiter="\t")
In [11]: grouped = itertools.groupby(data_stream, key=lambda x:x['idx2'])
In [12]: data = [(k,list(g)) for k,g in grouped] # order is important, so use a list
In [13]: data
Out[13]:
[('6',
[{'idx1': '4', 'idx2': '6', 'pos': '11', 'val1': 'C', 'val2': 'A'},
{'idx1': '4', 'idx2': '6', 'pos': '15', 'val1': 'A', 'val2': 'T'},
{'idx1': '4', 'idx2': '6', 'pos': '23', 'val1': 'T', 'val2': 'T'}]),
('3',
[{'idx1': '4', 'idx2': '3', 'pos': '28', 'val1': 'A', 'val2': 'G'},
{'idx1': '4', 'idx2': '3', 'pos': '34', 'val1': 'G', 'val2': 'C'}]),
('4',
[{'idx1': '4', 'idx2': '4', 'pos': '41', 'val1': 'C', 'val2': 'T'},
{'idx1': '4', 'idx2': '4', 'pos': '51', 'val1': 'C', 'val2': 'C'}])]
至于你的第二个问题,尝试类似的东西:
In [15]: import collections
In [16]: def accumulate(data):
...: acc = collections.OrderedDict()
...: for d in data:
...: for k,v in d.items():
...: acc.setdefault(k,[]).append(v)
...: return acc
...:
In [17]: grouped_data = {k:accumulate(d) for k,d in data}
In [18]: grouped_data
Out[18]:
{'3': OrderedDict([('pos', ['28', '34']),
('idx2', ['3', '3']),
('val2', ['G', 'C']),
('val1', ['A', 'G']),
('idx1', ['4', '4'])]),
'4': OrderedDict([('pos', ['41', '51']),
('idx2', ['4', '4']),
('val2', ['T', 'C']),
('val1', ['C', 'C']),
('idx1', ['4', '4'])]),
'6': OrderedDict([('pos', ['11', '15', '23']),
('idx2', ['6', '6', '6']),
('val2', ['A', 'T', 'T']),
('val1', ['C', 'A', 'T']),
('idx1', ['4', '4', '4'])])}
请注意,我使用了列表(和字典)理解。他们的工作方式相似。列表理解等同于:
data = []
for k, g in grouped:
data.append((k, list(g))
尽管我使用的是 OrderedDict,但为了更好的衡量,这里等效于 dict-comprehension,因为在任何情况下,顺序似乎都很重要:
In [20]: grouped_data = collections.OrderedDict()
In [21]: for k, d in data:
...: grouped_data[k] = accumulate(d)
...:
In [22]: grouped_data
Out[22]:
OrderedDict([('6',
OrderedDict([('val2', ['A', 'T', 'T']),
('val1', ['C', 'A', 'T']),
('pos', ['11', '15', '23']),
('idx2', ['6', '6', '6']),
('idx1', ['4', '4', '4'])])),
('3',
OrderedDict([('val2', ['G', 'C']),
('val1', ['A', 'G']),
('pos', ['28', '34']),
('idx2', ['3', '3']),
('idx1', ['4', '4'])])),
('4',
OrderedDict([('val2', ['T', 'C']),
('val1', ['C', 'C']),
('pos', ['41', '51']),
('idx2', ['4', '4']),
('idx1', ['4', '4'])]))])
请注意,我们可以一次完成所有操作,避免创建不必要的数据结构:
import itertools, io, csv, collections
data_stream = csv.DictReader(io.StringIO(raw_data), delimiter="\t")
grouped = itertools.groupby(data_stream, key=lambda x:x['idx2'])
def accumulate(data):
acc = collections.OrderedDict()
for d in data:
for k,v in d.items():
acc.setdefault(k,[]).append(v)
return acc
grouped_data = collections.OrderedDict()
for k, g in grouped:
grouped_data[k] = accumulate(g)
关于python - 将csv.DictReader对象转换为非iter类型的数据并按键合并值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48197549/
应该Dialect.strict在 DictReader 上,如果一行中的列数与标题列数不匹配,它会引发异常吗? The docs (强调我的): To make it easier to speci
这个问题已经有答案了: Skip first couple of lines while reading lines in Python file (9 个回答) 已关闭 3 年前。 我有一些 csv
我有一个包含内容(示例)的 .csv 文件 Attributes,Description,Dial-Up 4,2,0.2 3,1,0.4 使用字典阅读器: dictreader = csv.DictR
我有一个 Excel .CSV 文件,我正在尝试使用 DictReader 读入。 一切似乎都很好,除了它似乎省略了行,特别是那些缺少列的行。 我们的输入看起来像: mail,givenName,sn
我正在使用 DictReader 和 DictWriter 处理一个 csv 文件。 我尝试根据找到的以下代码工作 here : import csv fieldnames = ['Node', 'I
我有一个 CSV 文件,其中一些数据中嵌入了 NUL 字节。 给定 A B C D 列,C 列中的一个字段将包含如下数据 ,引号字符“一些数据”NUL“更多数据”NUL“数据结束”引号字符, 当我用
我已经阅读了一个 csv 文件, with open('test.csv', newline='') as csv_file: #restval = blank columns = -
我有一个 test.csv文件: foo,bar,foobar,barfoo 1,2,3,4 5,6,7,8 9,10,11,12 以及以下 CSV解析器: #!/usr/bin/env python
我的 csv 文件以分号作为分隔符。我可以用打开它 r = csv.reader(infile, delimiter=";") 没有任何问题。问题是我想将文件作为字典打开。 csv.DictReade
我有这个读取函数,它使用 csv.DictReader 读取 csv 文件。 file.csv 以逗号分隔,可完整读取。但是,我的文件的这一部分有一列包含多个逗号。我的问题是,如何确保逗号算作列的一部
我使用以下代码作为解析 FCC License View 的概念证明 sample data set : import csv if __name__ == '__main__': csv_f
圣诞快乐! 我有以下数据: a = (" 101, 151, 0,'T1',2,2,1, 1.71470E-1,-1.02880E-1,2,'NUCA GSU ',1, 1,
我使用csv.DictReader从 CSV 文件读取数据。当读取器被迭代时,它会生成带有从 CSV header 获取的键和每行值的字典: with open(filename) as h:
使用以下代码: import sys import os import csv if __name__ == '__main__': csvRaw = csv.dictreader(open(
我是 python 新手,尝试理解如何使用 csv.DictReader 上的过滤器函数来过滤 csv 文件中的行。 filter()可以用于“可迭代”,据我了解 DictReader适合这个defi
我使用 DictReader 指定字段名称,但并非所有列都有用,甚至包含数据。如何指定要标记哪些列?这是我的代码: my_tot_reader = csv.DictReader(tot_file, d
这个脚本工作正常,直到我点击一个空的单元格: import csv,time,string,os,requests dw = "\\\\network\\folder\\btc.csv" inv_fi
有没有一种方法可以模拟 DictReader 进行单元测试,而无需实际编写文件然后重新打开它。 我的函数接受一个 DictReader 实例,所以我可以轻松地传递给它们一个来测试它们的功能,但似乎无法
我正在尝试反转读取文件的方式。我正在使用 DictReader,因为我想要字典中的内容。我想读取文件中的第一行并将其用于键,然后反向(从下到上)解析文件,有点像 linux“tac”命令。是否有捷径可
def openFile(fileName): try: trainFile = io.open(fileName,"r",encoding = "utf-8") ex
我是一名优秀的程序员,十分优秀!