从stream中根据\n分割字符存储,再将每个字符串按照逗号存储成数组
时间: 2023-11-22 22:53:04 浏览: 146
好的,你可以参考以下代码实现:
```python
stream = "abc,def\nghi,jkl\nmno,pqr\n"
lines = stream.split('\n') # 根据换行符分割字符串
arrays = []
for line in lines:
if line: # 排除空行
array = line.split(',') # 根据逗号分割字符串
arrays.append(array)
print(arrays)
```
输出结果为:
```
[['abc', 'def'], ['ghi', 'jkl'], ['mno', 'pqr']]
```
其中,`split()` 方法用于根据指定分隔符将字符串分割成一个列表。在此代码中,我们首先根据换行符 `\n` 分割字符串,得到每一行的字符串。然后再对每一行的字符串使用 `split(',')` 方法,根据逗号 `,` 分割成一个数组,并存储到 `arrays` 列表中。最后输出 `arrays` 列表即可。
相关问题
优化代码,用list存储从unsigned char * stream中根据\n分割字符存储,再将每个字符串按照逗号存储成数组
以下是一个可能的优化代码:
```python
def parse_stream(stream):
# 将 stream 按照 \n 分隔成字符串列表
lines = stream.split(b'\n')
# 去掉末尾的空行
if not lines[-1]:
lines.pop()
arrays = []
for line in lines:
# 将每一行按照逗号分隔成字符串列表
fields = line.split(b',')
# 将字符串列表转换为整数列表
array = [int(field) for field in fields]
arrays.append(array)
return arrays
```
这个代码使用了 `split()` 方法来将 `stream` 按照 \n 分割成字符串列表,并使用了列表推导式来将每个字符串列表转换成整数列表。同时,代码也去掉了末尾的空行。最终,这个代码返回了整个流中所有的整数列表。
C语言优化代码,用list存储从unsigned char * stream中根据\n分割字符存储,再将每个字符串按照逗号存储成数组
以下是一个可能的优化方案:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 1024
int main() {
unsigned char *stream = "abc,def\nghi,jkl\nmno,pqr\n";
size_t stream_len = strlen(stream);
// 分配存储字符串的列表的空间
char **string_list = (char **)malloc(stream_len * sizeof(char *));
size_t string_list_len = 0;
char *buf = (char *)malloc(BUF_SIZE * sizeof(char));
size_t buf_len = 0;
for (size_t i = 0; i < stream_len; i++) {
if (stream[i] == ',' || stream[i] == '\n') {
// 将新的字符串复制到列表中
string_list[string_list_len] = (char *)malloc((buf_len + 1) * sizeof(char));
strncpy(string_list[string_list_len], buf, buf_len);
string_list[string_list_len][buf_len] = '\0';
string_list_len++;
// 重置缓冲区
memset(buf, 0, buf_len);
buf_len = 0;
// 跳过逗号和换行符
continue;
}
// 将字符添加到缓冲区中
buf[buf_len++] = stream[i];
// 如果缓冲区已满,则扩展缓冲区的大小
if (buf_len == BUF_SIZE) {
BUF_SIZE *= 2;
buf = (char *)realloc(buf, BUF_SIZE * sizeof(char));
}
}
// 将最后一个字符串复制到列表中
string_list[string_list_len] = (char *)malloc((buf_len + 1) * sizeof(char));
strncpy(string_list[string_list_len], buf, buf_len);
string_list[string_list_len][buf_len] = '\0';
string_list_len++;
// 释放缓冲区
free(buf);
// 分配存储数组的空间
char ***array_list = (char ***)malloc(string_list_len * sizeof(char **));
size_t array_list_len = 0;
for (size_t i = 0; i < string_list_len; i++) {
char *string = string_list[i];
if (*string == '\0') {
// 忽略空字符串
continue;
}
// 分配存储数组元素的空间
char **array = (char **)malloc(BUF_SIZE * sizeof(char *));
size_t array_len = 0;
char *array_buf = (char *)malloc(BUF_SIZE * sizeof(char));
size_t array_buf_len = 0;
for (size_t j = 0; j < strlen(string); j++) {
if (string[j] == ',') {
// 将新的元素复制到数组中
array[array_len] = (char *)malloc((array_buf_len + 1) * sizeof(char));
strncpy(array[array_len], array_buf, array_buf_len);
array[array_len][array_buf_len] = '\0';
array_len++;
// 重置缓冲区
memset(array_buf, 0, array_buf_len);
array_buf_len = 0;
// 跳过逗号
continue;
}
// 将字符添加到缓冲区中
array_buf[array_buf_len++] = string[j];
// 如果缓冲区已满,则扩展缓冲区的大小
if (array_buf_len == BUF_SIZE) {
BUF_SIZE *= 2;
array_buf = (char *)realloc(array_buf, BUF_SIZE * sizeof(char));
}
}
// 将最后一个元素复制到数组中
array[array_len] = (char *)malloc((array_buf_len + 1) * sizeof(char));
strncpy(array[array_len], array_buf, array_buf_len);
array[array_len][array_buf_len] = '\0';
array_len++;
// 释放缓冲区
free(array_buf);
// 将数组添加到列表中
array_list[array_list_len] = array;
array_list_len++;
}
// 输出结果
for (size_t i = 0; i < array_list_len; i++) {
printf("array %lu: [", i);
char **array = array_list[i];
size_t array_len = strlen(array[0]);
for (size_t j = 0; j < array_len; j++) {
printf("%s", array[j]);
if (j < array_len - 1) {
printf(", ");
}
}
printf("]\n");
}
// 释放存储字符串的列表的空间
for (size_t i = 0; i < string_list_len; i++) {
free(string_list[i]);
}
free(string_list);
// 释放存储数组的空间
for (size_t i = 0; i < array_list_len; i++) {
char **array = array_list[i];
size_t array_len = strlen(array[0]);
for (size_t j = 0; j < array_len; j++) {
free(array[j]);
}
free(array);
}
free(array_list);
return 0;
}
```
该代码的主要思路是,首先将输入流中的所有字符串存储在一个列表中,然后将每个字符串按逗号分割,并将结果存储在一个数组中。可以看到,我们使用了动态内存分配来处理变长的输入流和字符串。
在处理输入流时,我们使用了一个缓冲区来存储当前正在读取的字符串。每当遇到逗号或换行符时,我们将缓冲区中的字符串复制到列表中,并重置缓冲区以准备读取下一个字符串。为了避免频繁的内存分配,我们使用了一个固定大小的缓冲区,并在需要时动态地扩展其大小。
在处理字符串时,我们使用类似的方法。我们使用一个缓冲区来存储当前正在读取的元素,并在遇到逗号时将其复制到数组中。为了避免频繁的内存分配,我们使用了一个固定大小的缓冲区,并在需要时动态地扩展其大小。
最后,我们输出存储的数组,并释放分配的内存。
阅读全文