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