gpt4 book ai didi

python - Fortran 中以下 Python 列表理解的等价物是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 17:29:54 25 4
gpt4 key购买 nike

我正在尝试用 Fortran 语言编写以下列表理解(用 Python 编写)。

lit = [[x,y] for x in [p,q,r] for y in [h,k,l] if [x,y]!=[a,b]]

哪里 a, b, p ,q ,r, h, k, l是整数

如果我想在 2D Fortran 数组中先填充列,如何实现?

Python 代码返回一个列表。相当于

for x in [p,q,r]:
for y in [h,k,l]:
if [x,y]!=[a,b]:
list.append([x,y])

我在 Fortran 中创建了两个子列表。 sublist_xsublist_y其中每个列表包含 p,q,rh,k,l分别。

integer :: list(0:7), sublist_x(0:2),sublist_y(0:2), count
count =-1

do i=0,7
if (i%3 ==0)
count = count +1
endif
list(0,i)=sublist_x(i%3)
list(1,i)=sublist_y(count%3)
enddo

我认为这是一种复杂的做事方式......

最佳答案

如果我理解正确的话,您想要两个小列表的笛卡尔积,不包括元素 [a,b] ?如果我误解了,请立即停止阅读。这是一个小程序,几乎可以满足您的要求......

PROGRAM test

IMPLICIT NONE

INTEGER, DIMENSION(:), ALLOCATABLE :: listx, listy, bad_element
INTEGER, DIMENSION(:,:), ALLOCATABLE :: outlist
INTEGER :: ix, jx, alstat, n_elements

LOGICAL, DIMENSION(:), ALLOCATABLE :: rows

listx = [1,2,3]
listy = [21,22,23]
bad_element = [3,21]

n_elements = SIZE(listx)*SIZE(listy)
ALLOCATE(outlist(2,n_elements),stat=alstat)
IF (alstat/=0) THEN
WRITE(*,*) "something went wrong allocating the result array"
STOP
ELSE
outlist(1,:) = RESHAPE(listx,[n_elements],listx)
outlist(2,:) = RESHAPE(SPREAD(listy,1,SIZE(listx)),[n_elements])
END IF

DO ix = 1, n_elements
IF (ALL(outlist(:,ix)==bad_element)) THEN
outlist(:,ix:) = EOSHIFT(outlist(:,ix:),1,dim=2)
END IF
END DO

END PROGRAM TEST

在此程序的末尾,outlist 包含笛卡尔积,其中任何与坏元素相等的元素都被 0 替换,并推送到 outlets 的末尾。对于上面的硬连线数字,输出为:

    1    2    1    2    3    1    2    3    0
21 21 22 22 22 23 23 23 0

我想您应该不会有太大的困难来修剪它以删除 0 ,也不会将这个程序打包到例程中。我希望代码能够 self 解释。

关于python - Fortran 中以下 Python 列表理解的等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32036441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com