如何在Python中为字符串列表自定义map()?
如何让如何在Python中为字符串列表自定义map()?,python,csv,map,Python,Csv,Map,如何让map()有选择地将列表中的部分字符串(而不是所有字符串)转换为整数值 输入文件(以制表符分隔): 我的尝试: import csv with open('file.txt') as f: start = csv.reader(f, delimiter='\t') for row in start: X = map(int, row) print X 错误消息:ValueError:以10为基数的int()的文本无效:“abc1” 当我使
map()
有选择地将列表中的部分字符串(而不是所有字符串)转换为整数值
输入文件(以制表符分隔):
我的尝试:
import csv
with open('file.txt') as f:
start = csv.reader(f, delimiter='\t')
for row in start:
X = map(int, row)
print X
错误消息:ValueError:以10为基数的int()的文本无效:“abc1”
当我使用csv
模块读入文件时,它是一个字符串列表:
['abc1', '34', '56']
['abc1', '78', '90']
map()
我彻底检查了输入文件,但它并没有帮助我处理输入文件的第一列
def safeint(val):
try:
return int(val)
except ValueError:
return val
for row in start:
X = map(safeint, row)
print X
这是一种方法。。。你可以更进一步
from functools import partial
myMapper = partial(map,safeint)
map(myMapper,start)
这是一种方法。。。你可以更进一步
from functools import partial
myMapper = partial(map,safeint)
map(myMapper,start)
仅映射列表中您感兴趣的部分:
row[1:] = map(int, row[1:])
print row
这里,行[1:][/code>是列表的一部分,从第二个元素(索引为1的元素)开始,一直到列表的末尾。只映射列表中您感兴趣的部分:
row[1:] = map(int, row[1:])
print row
这里,行[1:][/code>是列表的一部分,从第二个元素(索引为1的元素)开始,一直到列表的末尾。我喜欢Roberto Bonvallet的答案,但是如果你想像你在问题中所做的那样一成不变,你可以:
import csv
with open('file.txt') as f:
start = csv.reader(f, delimiter='\t')
for row in start:
X = [row[0]] + map(int, row[1:])
print X
……或者
numeric_cols = (1, 2)
X = [int(value) if col in numeric_cols else value
for col, value in enumerate(row])
…或者,可能最容易理解的是,将其封装在map\u partial
函数中,这样您就可以执行以下操作:
X = map_partial(int, (1, 2), row)
您可以将其实现为:
def map_partial(func, indices, iterable):
return [func(value) if i in indices else value
for i, value in enumerate(iterable)]
如果您希望在完成后能够访问所有行,则不能只打印每一行,而必须将其存储在某种结构中。所需的结构取决于以后如何引用这些行
例如,您可能只需要一个行列表:
rows = []
with open('file.txt') as f:
for row in csv.reader(f, delimiter='\t'):
rows.append(map_partial(int, (1, 2), row))
print('The second column of the first row is {}'.format(rows[0][1]))
rows = {}
with open('file.txt') as f:
for row in csv.reader(f, delimiter='\t'):
rows.setdefault(row[0], []).append(map_partial(int, (1, 2), row))
print('The second column of the first abc1 row is {}'.format(rows['abc1'][0][1]))
或者,您可能希望能够通过第一列中的字符串ID而不是索引来查找它们。由于这些ID不是唯一的,因此每个ID将映射到一个行列表:
rows = []
with open('file.txt') as f:
for row in csv.reader(f, delimiter='\t'):
rows.append(map_partial(int, (1, 2), row))
print('The second column of the first row is {}'.format(rows[0][1]))
rows = {}
with open('file.txt') as f:
for row in csv.reader(f, delimiter='\t'):
rows.setdefault(row[0], []).append(map_partial(int, (1, 2), row))
print('The second column of the first abc1 row is {}'.format(rows['abc1'][0][1]))
我喜欢Roberto Bonvallet的回答,但如果你想一成不变地做事,就像你在问题中所做的那样,你可以:
import csv
with open('file.txt') as f:
start = csv.reader(f, delimiter='\t')
for row in start:
X = [row[0]] + map(int, row[1:])
print X
……或者
numeric_cols = (1, 2)
X = [int(value) if col in numeric_cols else value
for col, value in enumerate(row])
…或者,可能最容易理解的是,将其封装在map\u partial
函数中,这样您就可以执行以下操作:
X = map_partial(int, (1, 2), row)
您可以将其实现为:
def map_partial(func, indices, iterable):
return [func(value) if i in indices else value
for i, value in enumerate(iterable)]
如果您希望在完成后能够访问所有行,则不能只打印每一行,而必须将其存储在某种结构中。所需的结构取决于以后如何引用这些行
例如,您可能只需要一个行列表:
rows = []
with open('file.txt') as f:
for row in csv.reader(f, delimiter='\t'):
rows.append(map_partial(int, (1, 2), row))
print('The second column of the first row is {}'.format(rows[0][1]))
rows = {}
with open('file.txt') as f:
for row in csv.reader(f, delimiter='\t'):
rows.setdefault(row[0], []).append(map_partial(int, (1, 2), row))
print('The second column of the first abc1 row is {}'.format(rows['abc1'][0][1]))
或者,您可能希望能够通过第一列中的字符串ID而不是索引来查找它们。由于这些ID不是唯一的,因此每个ID将映射到一个行列表:
rows = []
with open('file.txt') as f:
for row in csv.reader(f, delimiter='\t'):
rows.append(map_partial(int, (1, 2), row))
print('The second column of the first row is {}'.format(rows[0][1]))
rows = {}
with open('file.txt') as f:
for row in csv.reader(f, delimiter='\t'):
rows.setdefault(row[0], []).append(map_partial(int, (1, 2), row))
print('The second column of the first abc1 row is {}'.format(rows['abc1'][0][1]))
您的第一个代码段引发错误:TypeError:无法连接'str'和'list'对象
不客气。由于此文件是逐行读取的,您知道在某个特定行中获取某些值的方法吗(例如,如何获取值34)<代码>行[1]
似乎只抓住了整个第1列,而不是该列中的特定条目…@XYZ927:您编写的循环(以及所有答案,包括我的)一次只处理一行。如果希望能够返回到特定行,则需要将这些行存储在列表中,而不仅仅是打印出来。然后行[0]
是第一行,行[0][1]
是第一行的第二列(即34
)。如果不清楚,我将编辑答案。您的第一个代码段会引发错误:TypeError:无法连接'str'和'list'对象
不客气。由于此文件是逐行读取的,您知道在某个特定行中获取某些值的方法吗(例如,如何获取值34)<代码>行[1]
似乎只抓住了整个第1列,而不是该列中的特定条目…@XYZ927:您编写的循环(以及所有答案,包括我的)一次只处理一行。如果希望能够返回到特定行,则需要将这些行存储在列表中,而不仅仅是打印出来。然后行[0]
是第一行,行[0][1]
是第一行的第二列(即34
)。如果不清楚,我将编辑答案。请您解释一下为什么两次使用行[1::][/code>不会覆盖自身或进入某种奇怪的无限循环?@XYZ927:如果您了解索引的实际实现方式,这将有助于理解。这行代码相当于行。uuuu setitem(切片(1,无),map(int,行。uuuu getitem(切片(1,无)))
。没有无限循环,它只是将一个表示“从1到结尾的所有内容”的切片对象传递到\uuuuu getitem\uuuuuu
,因此\uuuuu getitem\uuuuu
返回从1到结尾的所有内容的副本;随后,它将同一个slice对象传递给\uuuuu setitem\uuuuuuu
,因此\uuuuuuuuu setitem\uuuuuuu
用map
调用的结果替换从1到结尾的所有内容,首先计算=
符号右侧的表达式,一旦获得值(即没有行[1://code>,只有最终结果),解释器才会查看左侧符号以查看结果的存储位置。请解释为什么使用行[1:]
tweep不会覆盖自身或进入某种时髦的无限循环?@XYZ927:如果您了解索引是如何实际实现的,这将有助于理解。这行代码相当于行。uuuu setitem(切片(1,无),map(int,行。uuuu getitem(切片(1,无)))
。没有无限循环,它只是将一个表示“从1到结尾的所有内容”的切片对象传递到\uuuuu getitem\uuuuuu
,因此\uuuuu getitem\uuuuu
返回从1到结尾的所有内容的副本;然后,后来,它通过了