Python 如何拆分一条线并将其成对映射?
我正在尝试将文件转换为(键、值)对。 每行代码如下所示:Python 如何拆分一条线并将其成对映射?,python,Python,我正在尝试将文件转换为(键、值)对。 每行代码如下所示: 1 A B C D 2 3 E 4 F G 我想把它们配对成一对 (1,A),(1,B),(1,C),(1,D),(3,E),(4,F),(4,G) 我试图在python/scala中实现这一点,但无法找到解决方案,除非我逐行读取文件并使用循环来实现这一点。 scala中的代码是: val fileRDD = sc.textFile("input.txt") val map = fileRDD.filter(_.split("\t")
1 A B C D
2
3 E
4 F G
我想把它们配对成一对
(1,A),(1,B),(1,C),(1,D),(3,E),(4,F),(4,G)
我试图在python/scala中实现这一点,但无法找到解决方案,除非我逐行读取文件并使用循环来实现这一点。
scala中的代码是:
val fileRDD = sc.textFile("input.txt")
val map = fileRDD.filter(_.split("\t").length>1).map{
line=>
val fields = line.split("\t")
var i = 1;
while(i<fields.length){
(fields(0),fields(1))
i=i+1
}
}
val fileRDD=sc.textFile(“input.txt”)
val-map=fileRDD.filter(u.split(“\t”).length>1.map{
行=>
val字段=行分割(“\t”)
var i=1;
而(i首先,根据分隔符拆分行
String[]pairs=input.split(“”;
然后,在所做拆分中的每个字符串上循环,直到用完所有对
int index = 0;
while (index + 1 < pairs.length) {
index += 2;
}
给我输出:
3 : E
D : 2
1 : A
B : C
4 : F
请注意如何跳过G
,因为在Python中没有与键G
关联的值。您可以使用列表理解添加所谓的键/值对,如下所示:
with open('your_file', 'r') as f:
result = []
for line in f:
line = line.strip().split(' ')
result += [(int(line[0]), x) for x in line[1:] if x]
您需要的是为每一行循环(去掉换行符和空格),循环行没有什么错,抓住第一个元素作为“键”,将其余元素作为“值”配对(如果有)。给定输入
1A B C D
2
3e
4 F G
你只需抓取每行的数字和后面的字符,然后拆分字符并为每行创建一个元组
密码
输出
[(1,'A')、(1,'B')、(1,'C')、(1,'D')、(3,'E')、(4,'F')、(4,'G')]
file.txt
1 A B C D
2
3 E
4 F G
main.py
lines = open('file.txt').readlines() # open raw file
lines = [line.strip() for line in lines] # remove excess
lines = [line.split(' ') for line in lines] # split lines
pairs = []
for line in lines:
key = int(line[0]) # number key
for char in line[1:]:
if len(lines) > 1:
new = (key, char) # create new pair
pairs.append(new) # add pair to list
print pairs
这是一个无环Scala版本:
def source = scala.io.Source fromFile "input.txt"
def lines = source.getLines
def tokens = lines map (_ split "\t")
def pairs = tokens flatMap (line => line.tail map (line.head -> _))
pairs.toList
source
的定义应该是显而易见的:我得到了一个source
来阅读
行
定义为文件中的行返回一个迭代器[String]
。请注意,使用后确实需要关闭源
,我在这里不这样做
我定义tokens
来获取每一行并拆分它。它将是一个迭代器[Array[String]]
,其中数组中的每个元素都是一个单词,迭代器中的每个元素都是该行的一个单词数组
让我们以for CONTRUSION格式重写对
,以便更好地理解它。请注意,下面的内容转换为与原始定义完全相同的命令:
def pairs = for {
line <- tokens
letter <- line.tail
} yield line.head -> letter
def pairs=for{
输入中的第2行如何?请发布一些到目前为止您已经尝试过的代码,哪些代码不起作用。我正试图用python来做这件事-为什么要使用java
标记?“逐行阅读文件并使用循环来做这件事”为什么要用Java、Python和Scala标记它?这正是我想要的。请帮助我理解它!!@PiyushAgal好的,我扩展了答案。
lines = open('file.txt').readlines() # open raw file
lines = [line.strip() for line in lines] # remove excess
lines = [line.split(' ') for line in lines] # split lines
pairs = []
for line in lines:
key = int(line[0]) # number key
for char in line[1:]:
if len(lines) > 1:
new = (key, char) # create new pair
pairs.append(new) # add pair to list
print pairs
def source = scala.io.Source fromFile "input.txt"
def lines = source.getLines
def tokens = lines map (_ split "\t")
def pairs = tokens flatMap (line => line.tail map (line.head -> _))
pairs.toList
def pairs = for {
line <- tokens
letter <- line.tail
} yield line.head -> letter