如何获得两个单词之间的列表的子列表 [英] How to get a sublist of a list between two words

查看:53
本文介绍了如何获得两个单词之间的列表的子列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

从这样的列表开始:

words = ['tree', 'water', 'dog', 'soap', 'bike', 'cat', 'bird']

我想获得两个指定单词之间的子列表.例如,如果我有单词'water''bike',我想获取子列表:

I want to get the sublist between two specified words. For example, if I have the words 'water' and 'bike' I want to get the sublist:

words = ['water', 'dog', 'soap', 'bike']

或者如果列表是

words = ['tree', 'water', 'dog', 'soap', 'tree', 'cat', 'bird']

,然后我将'tree''tree'分别添加到该子列表中:

and I put the words 'tree' and 'tree' I want to get this sublist:

words = ['tree', 'water', 'dog', 'soap', 'tree']

我也用C编写了这样的程序,但是目前我对Python不太满意. 这是我的C版本:

I have also written a program like this in C, but I'm not very good with Python at the moment. This is my C version:

struct node {
    char *key;
    struct node *next;
    struct node *prev;
};
typedef struct node node;

node *GetSublist(node *, char *, char *);
node *MakeStringList();
void PrintStringList(node *a);

node *GetSublist(node *a, char *k1, char *k2) {

    node *p = a;
    node *n1, *n2;

    while (strcmp(p->key, k1) != 0) {
        p = p->next;
        if (p == NULL) {
            return a;
        }
    }

    n1 = p;
    n2 = p->next;

    if (n1->prev != NULL) {
        while (a != n1) {
            free(a);
            a = a->next;
        }
    }
    a->prev = NULL;

    while (strcmp(n2->key, k2) != 0) {
        n2 = n2->next;
        if (n2 == NULL) {
            return a;
        }
    }

    if (n2->next != NULL) {
        while (n2->next == NULL) {
            free(n2->next);
            n2 = n2->next;
        }
        n2->next = NULL;
    }

    return a;
}

int main(){

    char *k1 = "dog";
    char *k2 = "ball";
    node *list1 = NULL;
    list1 = MakeStringList();
    PrintStringList(list1);
    list1 = GetSublist(list1, k1, k2);
    PrintStringList(list1);


return 0;
}

node *MakeStringList() {             
    node *a = NULL, *punt, *p;
    int i;
    int dim;

    printf("Number of elements: ");
    scanf("%d", &dim);

    for (i=0; i<dim; i=i+1) {
        punt = malloc( sizeof(node) );
        punt->key = (char*)malloc(30*sizeof(char));
        scanf( "%s", punt->key );
        punt->next = NULL;
        punt->prev = NULL;
        if(a == NULL) {
            a = punt;
            p = punt;
        } else {
            p->next = punt;
            punt->prev = p;
            p = punt;
        }
    }
return a;
}

void PrintStringList(node *a) {                   
    node *p = a;
    printf("\nThe list is: { ");
    while( p != NULL ) {
        if (p->next == NULL)
            printf("%s ", p->key);
        else
        printf("%s, ", p->key);
        p = p->next;

    }
    printf("}\n\n");
}

推荐答案

这可以通过列表的.index()方法以及切片符号来实现..

This can be accomplished with the .index() method of lists, and with the slice notation..

words = ['tree', 'water', 'dog', 'soap', 'cat', 'bird']
start_index = words.index(start_word)
end_index = words.index(end_word)
sublist = words[start_index:end_index+1]

这篇关于如何获得两个单词之间的列表的子列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆