Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中为字符串列表自定义map()?_Python_Csv_Map - Fatal编程技术网

如何在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到结尾的所有内容的副本;然后,后来,它通过了