【问题标题】:C to Python : For loopC 到 Python:For 循环
【发布时间】:2019-12-13 07:49:13
【问题描述】:

所以我在 C 中有这段代码,它输出以下内容:

代码:

scanf("%ld",&N);
long long A[N];
for(i=1;i<=N;i++)
    scanf("%lld", &A[i]);
for(i=1;i<N;i++)
    for(j=i;j<=N-1;j++) {
        printf("%d %d\n", A[i], A[j+1]);

输入:

5
1 2 3 4 5

输出:

1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5

如何使用 python 3.7.x 获得相同的输出?

试过了:

A = [1,2,3,4,5]
for i in range(len(A)):
        for j in range(len(A)):
            try:
                print(A[i],A[j+1])
            except IndexError:
                pass

尝试输出:

1 2
1 3
1 4
1 5
2 2
2 3
2 4
2 5
3 2
3 3
3 4
3 5
4 2
4 3
4 4
4 5
5 2
5 3
5 4
5 5

这是我得到的输出,它只是遍历每个循环,将值打印出来,然后得到重复的对。

帮助感谢,谢谢!

【问题讨论】:

  • 在 C 中,声明为 A[N] 的数组有 N 个条目,从 A[0]A[N-1]。访问A[N] 会调用未定义的行为,这将很难在 Python 中完全复制...
  • print(*(f'{j} {k}' for i, j in enumerate(a) for k in a[i + 1:]), sep='\n') 咳嗽
  • Python 方式!

标签: python c loops python-3.7


【解决方案1】:

这不是这样做的方式:

  • try / except 块很昂贵,这里实际上不需要它们
  • for 的那种形式不是很Pythonic

您应该尝试尽可能接近地复制 C 循环。为此,[Python 3. Docs]: Built-in Functions - enumerate(iterable, start=0) 派上用场(允许处理元素索引)。此外,还使用了序列切片

>>> a = [1, 2, 3, 4, 5]
>>>
>>> for idx0, elem0 in enumerate(a):
...     for elem1 in a[idx0 + 1:]:
...         print(f"{elem0} {elem1}")
...
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5

【讨论】:

  • 这个解决方案更像是pythonic(尽管你的缩进在你的打印语句上是关闭的)。
  • 谢谢,@Alexander,显然我因为赶时间而忽略了几个问题。
【解决方案2】:

您可以使用与c 代码相同的逻辑,这意味着j 将从i 开始:

A = [1,2,3,4,5]
for i in range(len(A)):
        for j in range(i, len(A)):
            try:
                print(A[i],A[j+1])
            except IndexError:
                pass

另一个优雅的解决方案是使用itertools 模块:

from itertools import combinations

A = [1,2,3,4,5]
comb = combinations(A, 2)
for c in comb:
    print(c)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多